1

一个文件已被 Perl 加密。初始解密尝试失败,我现在正在尝试确定是否有任何 hoojoo 正在进行(需要一些其他设置)

达夫 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 代码应该如何阅读

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

4 回答 4

11

我是 Perl 的Crypt::Rijndael的维护者。我没有编写原始代码,但是当其他人失败时,我会尝试使其工作。

我收到了另一份这样的报告,即RT #27632。模块中的问题是一个有符号的 int,它应该是一个无符号的 int。最新版本的Crypt::Rijndael 1.07 应该有修复。您使用的是哪个版本?

此外,其中一些问题与平台有关。如果您查看发行版中的 rijndael.h 代码,您会看到我必须跳过这些障碍才能为各种平台获取正确的类型大小。我认为您使用的是 Windows(但不是 Cygwin)。您使用的是哪个版本的 Windows?

如 RT 票证中所述,第一步是使用Crypt::Rijndael和 C# 实现使用相同的初始化向量加密相同的消息。你应该得到相同的输出。如果你没有得到相同的密文,那就有问题了。

让我知道这对你来说是如何工作的,以便我可以在需要时将其作为Crypt::Rijndael错误进行跟踪。

谢谢,

于 2009-02-20T19:42:02.850 回答
4

我假设你在 Windows 上运行它。您正在处理二进制数据,因此您需要考虑到这一点。在 Perl 中,您必须使用binmode。我认为您需要在 C# 中使用 BinaryReader(但我不是 C# 程序员,所以我不确定)。

于 2009-02-20T15:17:45.060 回答
4

你有相同的静脉注射尺寸吗?我在问,因为我在 Perl 到 C# 加密转换方面遇到了类似的问题,Perl 中的 IV 大小不同。

您的 KeySize 是 256(位),但您在 Perl 代码中的密钥是 3 个字节,12 位,如果我记得 Perl 用空格填充它。

于 2009-02-20T15:28:34.457 回答
2

您是否尝试过加密/解密一个简单的字符串?有了它,您可以验证加密中是否存在某些内容(而不是读取文件)。

于 2009-02-20T15:23:46.047 回答