文件已由Perl加密。初始解密尝试失败,我现在正试图确定是否有任何hoojoo正在进行(需要一些其他设置)
Duff Perl代码:
use strict;
use Crypt::Rijndael;
my $key ='...';
my $rcipher = Crypt::Rijndael->new ($key, Crypt::Rijndael::MODE_CBC());
undef $/;
my $encrypted = <>;
print $rcipher->decrypt($encrypted);
C#解密实施
CryptoStream decryptor = null;
StreamReader srDecrypt = null;
FileStream fsIn = null;
RijndaelManaged rijndaelCipher = null;
string fileContents;
try
{
rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Key = Encoding.UTF8.GetBytes(Password);
rijndaelCipher.IV = Encoding.UTF8.GetBytes(Password);
rijndaelCipher.Padding = PaddingMode.None;
fsIn = new FileStream(FilePath, FileMode.Open);
decryptor = new CryptoStream(fsIn, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read);
srDecrypt = new StreamReader(decryptor);
fileContents = srDecrypt.ReadToEnd();
}
finally
{
if (decryptor != null)
decryptor.Close();
if (fsIn != null)
fsIn.Close();
if (srDecrypt != null)
srDecrypt.Close();
if (rijndaelCipher != null)
rijndaelCipher.Clear();
}
Perl Code应如何阅读
binmode OUTF;
my $key ="..."; # Your secret key
my $rcipher = Crypt::Rijndael->new ($key, Crypt::Rijndael::MODE_CBC());
$rcipher->set_iv($key); # You may wish this IV to be something different from the Secret Key
my $plaintext = "Please encrypt me"; # Your string to be encrypted
if(length($plaintext) % 16 != 0 ) {
$plaintext .= ' ' x (16 - (length($plaintext) % 16)); }
my $rencrypted = $rcipher->encrypt($plaintext);
答案 0 :(得分:11)
我是Perl Crypt::Rijndael的维护者。我没有编写原始代码,但是当它为其他人失败时,我试着让它工作。
我收到了另一份报告RT #27632。模块中的问题是一个签名的int,应该是unsigned int。 Crypt::Rijndael的最新版本1.07应该有修复。你使用的是哪个版本?
此外,其中一些问题与平台有关。如果你查看发行版中的rijndael.h代码,你会看到我必须跳过的箍,以便为各种平台获得正确的类型大小。我认为你在Windows上(但不是Cygwin)。您使用的是哪个版本的Windows?
如RT票据中所述,第一步是使用Crypt::Rijndael和C#实现使用相同的初始化向量加密相同的消息。你应该得到相同的输出。如果您没有获得相同的crypttext,则会出现问题。
让我知道这对您有何影响,以便我可以根据需要将其作为Crypt::Rijndael错误进行跟踪。
谢谢,
答案 1 :(得分:4)
我假设你在Windows上运行它。您正在处理二进制数据,因此您需要考虑这一点。在Perl中,您必须使用binmode。我认为你需要在C#中使用BinaryReader(但我不是C#程序员,所以我不确定)。
答案 2 :(得分:4)
你有相同的IV尺寸吗?我问,因为我在Perl到C#加密转换方面遇到了类似的问题,其中Perl的IV大小不同。
你的KeySize是256(位),但你在Perl代码中的密钥是3个字节,12位,如果我记得Perl用白色空间填充它。
答案 3 :(得分:2)
您是否尝试过加密/解密一个简单的字符串? 有了它,你可以验证加密中有什么东西(而不是读取文件)。