C# Blowfish CBC加密未解密

C# Blowfish CBC加密未解密,c#,php,bouncycastle,mcrypt,blowfish,C#,Php,Bouncycastle,Mcrypt,Blowfish,我很难在.net环境中解密由mcrypt php库加密的blowfish加密字符串 下面是我用来加密一些数据的脚本 <?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 = mcry

我很难在.net环境中解密由mcrypt php库加密的blowfish加密字符串

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

<?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);
当我运行这段代码时,DoFinal会出现“损坏的填充块”异常。所以我读了关于pcks7填充的内容,它基本上填充了原始字符串的字节。我计算出,对于我的输入字符串和blowfish cbc算法块大小8,我需要两个字节的填充,因此我在字符串的末尾添加了“22”。然而,这产生了同样的结果

而且,我看不出有什么地方可以将IV插入到河豚解密中。我觉得我完全缺乏/不理解这里的关键点。有人知道这里出了什么问题吗?如果可能的话,我想跳过php中的填充部分,简单地用c#中的iv/passphrase进行解密,这可能吗

干杯,谢谢


Tom

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


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

发送带有密文的IV的方法就是
$cipherText=$IV$密文
。然后,他们说,您可以使用
substr()
(可能是
mb_substr()
)从合成中恢复IV和真实密码文本。使用恢复的IV和密钥解密密码文本

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

我在这里创建了一个河豚诊断页面。我使用的是PHP5.6.20,我无法让mcrypt解密我的数据,因为我有一个奇怪的IV问题。我向你描述的相同技术似乎不起作用。我发布了关于这个问题的诊断脚本文本:

以下是我的域的在线工作版本:

我想你尝试了别的东西是件好事。用河豚进行加密似乎效果不错,但即使使用原生PHP,解密过程似乎也存在问题。但是,可能只是我!;-)

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));