简体   繁体   English

TripleDES解密C#

[英]tripleDES decryption c#

I am given a tripleDES encrypted and encoded base 64 string: 我给了一个TripleDES加密和编码的基本64位字符串:

ABvAsOKcGXqc5uQ4O5Z53isJaH31Pa8+PeddljE4mSU= ABvAsOKcGXqc5uQ4O5Z53isJaH31Pa8 + PeddljE4mSU =

I am also given: 我还得到:

key size = 128; 密钥大小= 128;

key = 0123456789ABCDEF 键= 0123456789ABCDEF

iv = ABCDEFGH iv = ABCDEFGH

I have written out the following code. 我已经写出以下代码。 I keep on getting an exception thrown at me saying "Bad PKCS7 padding. Invalid length 31" I am losing a byte somewhere I think. 我一直在向我抛出一个异常,说“ PKCS7填充错误。长度31无效”,我在某个地方丢失了一个字节。 Can anyone please tell me what I am doing wrong. 谁能告诉我我在做什么错。

string base64Encoded = "ABvAsOKcGXqc5uQ4O5Z53isJaH31Pa8+PeddljE4mSU="; // 
string ASCIIkey = "0123456789ABCDEF";
string ASCIIiv = "ABCDEFGH";


TripleDESCryptoServiceProvider tDES = new TripleDESCryptoServiceProvider();
tDES.KeySize = 128;
tDES.BlockSize = 64;
tDES.Padding = PaddingMode.PKCS7;
tDES.Mode = CipherMode.ECB;
tDES.Key = Encoding.ASCII.GetBytes(ASCIIkey);
tDES.IV = Encoding.ASCII.GetBytes (ASCIIiv);
byte[] encryptedData = Convert.FromBase64String(base64Encoded);
ICryptoTransform transform = tDES.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
string message = System.Text.Encoding.ASCII.GetString(plainText);
Console.Write (message);

With

tDES.Mode = CipherMode.CBC;

and using as a reference HashAlgorithm.TransformBlock sample (see PrintHashMultiBlock ) 并将其用作参考HashAlgorithm.TransformBlock 示例 (请参见PrintHashMultiBlock

int offset = 0;
while(encryptedData.Length - offset >= size)
    offset += transform.TransformBlock(encryptedData, offset,
                                       encryptedData.Length - offset,
                                       outputBuffer, offset);

I was able to get a known phrase 我能得到一个已知的短语

All Your Base Are Belong To Us!! 你所有的基地都属于我们!!


However a better way is just to change two lines 但是更好的方法是只更改两行

tDES.Padding = PaddingMode.None;  // instead of PaddingMode.PKCS7
tDES.Mode = CipherMode.CBC;       // instead of CipherMode.ECB

This is suggested by @MaartenBodewes here . 这是@MaartenBodewes 在这里建议的。

So feel free to unaccept the answer, and delete the duplicate :-). 因此,请随时接受答案,并删除重复的:-)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM