我正在尝试使用Delphi Encryption Compendium的Cipher1 3.0,第一部分解密在Delphi中加密的c#中的一个字符串。 我使用TCipher_Rijndael。
我加密的字符串是:this-is-a-test-example
密码:传递
加密值为:iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw ==
当我尝试在c#中解密时,我发现错误:要解密的数据长度无效。
有没有人有同样的问题,什么是解决方案?
这是c#中的解密方法:
public static byte[] Decrypt(byte[] cipherData,
byte[] Key, byte[] IV)
{
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms,
alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length);
cs.Close();
byte[] decryptedData = ms.ToArray();
return decryptedData;
}
这是Delphi中的加密代码:
with TCipher_Rijndael.Create('pass', nil) do
begin
memo2.lines.add ( CodeString( 'this-is-a-test-example' , paEncode, fmtDEFAULT));
Free;
end;
感谢。
答案 0 :(得分:5)
您需要确定该值的加密方式的所有细节:
只有当您确切知道它是如何加密的时候才能反转过程以正确解密它。您可能想尝试发布更多代码或有关其加密方式的详细信息。然后有人可能能够确定你需要如何解密它。我之前见过this scenario未知数,我设法猜测细节以找到答案。我尝试了一些使用加密字符串的常用方法,但如果没有更多详细信息,我就无法轻易解密。
答案 1 :(得分:3)
您说您可以在C#中加密并在C#中解密。您也可以在C#中加密并在Delphi中解密。这意味着您的C#加密绝对没问题。这只留下了一个可能的罪魁祸首:德尔福加密。
这样做:
他们不可能是一样的。看看他们的不同之处。是一个Base64编码而另一个只是原始字节?用一个填充==而另一个没有填充吗?他们使用不同的Base64变体吗?
答案 2 :(得分:1)
尝试另一种方式。即加密c#中的字符串并查看它是否匹配。看看你的C#解决方案是否可以吃自己的狗食。
答案 3 :(得分:0)
我的猜测是Delphi加密将字符串编码为Ansi字符串(每个字符一个字节),C#加密将字符串编码为Unicode UTF16字符串(每个字符两个字节)。如果您使用Delphi 2007及以下版本,几乎可以肯定。
PS Delphi中加密字符串的长度也有点赠品 - 对于22个字符的原始字符串,32个字符表示每个字符一个字节 - 这不是C#的情况。