【发布时间】: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