C# 3DES不能为同一密文上的多次迭代生成一致的解密
我在代码中实现了一个3DES(TripleDES)解密例程,并注意到当提供的密文与上一次迭代相同时,它不会产生相同的明文。这似乎是不确定的,我肯定这是我做错了 我尝试过CBC(第四次调零)、ECB、多种处置和清算组合。我似乎无法获得一致的输出 (由于某些原因,下面“代码”和“输出”上的代码格式显示不正确,抱歉) 代码C# 3DES不能为同一密文上的多次迭代生成一致的解密,c#,encryption,3des,tripledes,C#,Encryption,3des,Tripledes,我在代码中实现了一个3DES(TripleDES)解密例程,并注意到当提供的密文与上一次迭代相同时,它不会产生相同的明文。这似乎是不确定的,我肯定这是我做错了 我尝试过CBC(第四次调零)、ECB、多种处置和清算组合。我似乎无法获得一致的输出 (由于某些原因,下面“代码”和“输出”上的代码格式显示不正确,抱歉) 代码 使用系统; 使用System.Security.Cryptography; 使用系统线程; 名称空间测试 { 班级计划 { 静态void Main(字符串[]参数) { while
使用系统;
使用System.Security.Cryptography;
使用系统线程;
名称空间测试
{
班级计划
{
静态void Main(字符串[]参数)
{
while(true)
{
字符串键=“27F66D5244FF621EAA6F6120EDEB427F”;
字符串密码=“C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA064C213BB55278B2F12”;
Console.WriteLine(“清除:+字节\数组\到\十六进制\字符串(
解密(
十六进制字符串到字节数组(密码),
十六进制字符串到字节数组(键)
),对,对
));
控制台。写线(“”);
睡眠(1000);
}
}
静态字节[]解密(字节[]密码,字节[]密钥)
{
if(cipher==null)返回null;
如果(key==null)返回null;
int num_chunks=(cipher.Length)/8;
Console.WriteLine(“输入解密”);
WriteLine(“-cipher:+字节数组到十六进制字符串(cipher,true,true));
WriteLine(“-key:+字节数组到十六进制字符串(key,true,true));
Console.WriteLine(“-cipher-length:+cipher.length”);
Console.WriteLine(“-key-length:+key.length”);
如果((cipher.Length%8)!=0)
{
Console.WriteLine(“密码长度不能被8整除”);
返回null;
}
如果((键长度%8)!=0)
{
Console.WriteLine(“键长度不能被8整除”);
返回null;
}
TripleDESCryptoServiceProvider tdes=新的TripleDESCryptoServiceProvider();
tdes.Key=Key;
tdes.Mode=CipherMode.ECB;
tdes.IV=新字节[]{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
tdes.Padding=PaddingMode.zero;
tdes.KeySize=(key.Length*8);
ICryptoTransform ct=tdes.CreateDecryptor();
WriteLine(“-IV:+字节数组到十六进制字符串(tdes.IV,true,true));
字节[]清除=新字节[(密码长度)];
clear=ct.TransformFinalBlock(密码,0,密码长度);
WriteLine(“-clear:+字节数组到十六进制字符串(clear,true,true));
tdes.Clear();
tdes.Dispose();
ct.Dispose();
返回清晰;
}
公共静态字节[]十六进制字符串到字节数组(字符串十六进制)
{
整数字符=十六进制长度;
byte[]bytes=新字节[number_chars/2];
对于(int i=0;i=0;i--)
{
如果(十六进制字符计数==0)
{
十六进制空格+=十六进制破折号[i];
十六进制字符计数++;
继续;
}
如果(十六进制字符计数%16==0)
{
十六进制空间=(十六进制虚线[i]+“”+十六进制空间);
十六进制字符计数++;
继续;
}
十六进制空格=十六进制虚线[i]+十六进制空格;
十六进制字符计数++;
}
返回十六进制空间;
}
其他的
{
返回十六进制破折号;
}
}
}
}
输出
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 10F99E2232BEC7F4
- clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E
6E5819ED 23125066DBA83477
clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E6E5
819ED 23125066DBA83477
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 32B9C802333CFBB4
- clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7
08832E90 77382A7A51A532C1
clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7088
32E90 77382A7A51A532C1
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 2FCB1A9F5B502E1B
- clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0
C04D3EC5 EEC551C3E845BF80
clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0C04
D3EC5 EEC551C3E845BF80
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 355096FE3CA1E9A1
- clear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B7
3B30840E 6030D791CD849A3D
clear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B73B3
0840E 6030D791CD849A3D
输入解密\u 3des
-密码:C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
-钥匙:27F66D5244FF621E AA6F6120EDEB427F
-密码长度:64
-键长:16
-IV:10F99E2232BEC7F4
-清除:BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E
6E5819ED 23125066DBA83477
清除:BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E6E5
819ED 23125066DBA83477
输入解密\u 3des
-密码:C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
-钥匙:27F66D5244FF621E AA6F6120EDEB427F
-密码长度:64
-键长:16
-IV:32B9C802333CFBB4
-清除:A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7
08832E90 77382A7A51A532C1
清除:A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7088
32E90 77382A7A51A532C1
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 10F99E2232BEC7F4
- clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E
6E5819ED 23125066DBA83477
clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E6E5
819ED 23125066DBA83477
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 32B9C802333CFBB4
- clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7
08832E90 77382A7A51A532C1
clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D7088
32E90 77382A7A51A532C1
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 2FCB1A9F5B502E1B
- clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0
C04D3EC5 EEC551C3E845BF80
clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0C04
D3EC5 EEC551C3E845BF80
Entering decrypt_3des
- cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0C
FD1EA1064 C213BB55278B2F12
- key: 27F66D5244FF621E AA6F6120EDEB427F
- cipher length: 64
- key length: 16
- IV: 355096FE3CA1E9A1
- clear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B7
3B30840E 6030D791CD849A3D
clear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B73B3
0840E 6030D791CD849A3D
static byte[] decrypt_3des(byte[] cipher, byte[] key)
{
byte[] clear;
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.None;
tdes.IV = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
try
{
ICryptoTransform ic = tdes.CreateDecryptor();
clear = ic.TransformFinalBlock(cipher, 0, cipher.Length);
}
finally
{
tdes.Clear();
}
return clear;
}