【问题标题】:Blowfish CBC encryption not decryptingBlowfish CBC加密不解密
【发布时间】:2015-09-25 00:40:42
【问题描述】:

我在 .net 环境中解密河豚加密字符串时遇到困难,该字符串由 mcrypt php 库加密。

这是我用来加密一些数据的脚本

<?php

function encrypt_blowfish($data, $key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC,    $iv);
    echo 'IV:   ' . bin2hex($iv) . "\n";
    echo 'DATA: ' . bin2hex($crypttext) ."\n" ;
}

$secretKey = 'somekey'; 
$data = 'Hello World this is an encryptiontest!';

encrypt_blowfish($data, $secretKey);

我决定使用 bouncingcastle 库,因为它似乎是加密的默认选择,而且他们有一个 PCL 版本(我需要)。出于测试目的,我只是将 echo'd 值复制/粘贴到我的 C# 代码中。

var ivString = "34c33fed0386dda1";
var iv = Hex.Decode (ivString);

var dataString = "ced4ed218d7a1fd228f8c43ca6b83f097648811661d5510678a26953729ceccdf6d78a7695cbfe43";
var data = Hex.Decode (dataString);

var keyString = "somekey";
var key = System.Text.Encoding.UTF8.GetBytes (keyString);

var engine = new BlowfishEngine();
var cipher =new PaddedBufferedBlockCipher(new CbcBlockCipher(engine));

var keyParam = new KeyParameter(key);
cipher.Init (false, keyParam);

var outBytes = new byte[data.Length];
var len = cipher.ProcessBytes (data, 0, data.Length, outBytes, 0);

cipher.DoFinal(outBytes, len);

Console.WriteLine(System.Text.Encoding.UTF8.GetString(outBytes));

当我运行此代码时,DoFinal 会因“损坏的填充块”异常而爆炸。所以我读到了 pcks7 填充,它基本上填充了原始字符串的字节。我计算出对于我的输入字符串和 8 的河豚 cbc 算法块大小,我需要两个字节的填充,所以我在字符串的末尾添加了“22”。然而,这产生了相同的结果。

另外,我看不到任何可以将 IV 插入河豚解密的地方。感觉就像我完全缺乏/不理解这里的一个关键点。 Any1关于这里出了什么问题的任何想法?另外,如果可能的话,我想跳过我的 php 中的填充部分,只需在 c# 中使用 iv/passphrase 进行解密,这可能吗?

干杯和感谢

汤姆

【问题讨论】:

    标签: c# php bouncycastle mcrypt blowfish


    【解决方案1】:

    @Tom,您的解密问题可能是由于 PHP mcrypt 库在需要使文本块与其固定块长度(64 位或 8 字节)一致时使用的 '\0' 填充。我听说.Net 使用不同的东西?此外,mcrypt_create_iv() 是否产生二进制数据?出于好奇,你为什么要在 IV 上使用bin2hex()

    使用密文发送 IV 的方式很简单,就是$cipherText = $iv . $cipherText。然后,他们说,您可以使用substr()(可能是mb_substr()从复合中恢复 IV 和真正的密文。使用恢复的 IV 和您的密钥来解密密文。

    最后一步是删除任何可能已被 mcrypt 添加到纯文本中的填充。

    我在这里创建了一个 Blowfish 诊断页面。我在 PHP 5.6.20 上,我无法让 mcrypt 解密我的数据,因为我有一个奇怪的 IV 问题。我向您描述的相同技术似乎不起作用。我在这个问题上发布了诊断脚本的文本:

    Blowfish IV Recovery Problem

    这是我域上的一个在线版本:

    Blowfish Diganositc Webpage

    我想你尝试了其他方法是件好事。使用 Blowfish 进行加密似乎工作正常,但即使使用本机 PHP,解密过程似乎也存在问题。但是,它可能只是我! ;-)

    【讨论】:

      【解决方案2】:

      我最终使用了一个更简单的库,它以非常简单的方式支持 cbc 模式。

      http://jaryl-lan.blogspot.de/2014/07/openfire-blowfish-encryptiondecryption.html

      【讨论】:

        猜你喜欢
        • 2019-05-15
        • 2016-07-25
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多