首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blowfish CBC加密不解密

Blowfish CBC加密不解密
EN

Stack Overflow用户
提问于 2015-07-07 21:33:16
回答 2查看 933关注 0票数 0

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

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

代码语言:javascript
复制
<?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#代码中。

代码语言:javascript
复制
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“。然而,这产生了相同的结果。

另外,我也看不出有什么地方可以把静脉注射到河豚的解密中。我感觉我完全缺乏/不理解这里的一个关键点。Any1对这里的错误有什么想法吗?另外,如果可能的话,我想跳过我的php中的填充部分,用c#中的iv/passphrase简单地解密,这可能吗?

干杯和感谢

汤姆

EN

回答 2

Stack Overflow用户

发布于 2015-07-07 21:56:40

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-17 23:06:54

@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,解密过程似乎也存在问题。但是,可能只有我!;-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31270046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档