河豚CBC加密不能解密
本文关键字:解密 不能 加密 CBC 河豚 | 更新日期: 2023-09-27 18:01:27
我在。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版本(我需要)。为了测试的目的,我只是复制/粘贴回滚值到我的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填充,它实际上填充了原始字符串的字节。我计算出我的输入字符串和blowfish cbc算法块大小为8,我需要两个字节的填充,所以我在字符串的末尾添加了"22"。然而,这产生了相同的结果。
而且,我看不出我可以将IV插入河豚解密中的任何点。感觉我完全没有理解一个关键点。有人知道哪里出了问题吗?此外,如果可能的话,我想跳过填充部分在我的php和简单地解密与c#中的iv/passphrase,这是可能的吗?
谢谢大家
汤姆我最终使用了一个更简单的库,它以一种非常简单的方式支持cbc模式。
http://jaryl-lan.blogspot.de/2014/07/openfire-blowfish-encryptiondecryption.html@Tom,您的解密问题可能是由于PHP mcrypt库在需要使文本块与其固定块长度(64位或8字节)一致时使用的''0'填充。我听说。net使用了一些不同的东西?此外,mcrypt_create_iv()
是否产生二进制数据?出于好奇,你为什么要在IV上使用bin2hex()
?
发送带有密文的IV的方式是简单的$cipherText = $iv . $cipherText
。然后,他们说,您可以使用substr()
(可能是mb_substr()
) 从复合中恢复IV和真正的密文。使用恢复的IV和您的密钥解密密文。
最后一步是删除可能由mcrypt添加到纯文本中的任何填充。
我在这里创建了一个河豚诊断页面。我在PHP 5.6.20,我不能得到加密解密我的数据,因为我有一个奇怪的IV问题。我向你描述的同样的技巧似乎不起作用。我贴出了这个问题的诊断脚本的文本:
河豚IV恢复问题
这是我的域名的在线版本:
河豚百科网页
我想这是一件好事,你尝试了其他的东西。使用Blowfish加密似乎工作得很好,但即使使用本机PHP,解密过程似乎也存在问题。但是,也可能只有我一个人!: -)