C# 3DES加密与第三方API不匹配
我的C#3DES加密与我使用的第三方API不匹配。我的代码有什么问题吗C# 3DES加密与第三方API不匹配,c#,3des,C#,3des,我的C#3DES加密与我使用的第三方API不匹配。我的代码有什么问题吗 static void Main(string[] args) { String sharedSec = "654A7EA2C9914A0B972937F4EA45FED3"; byte[] byteArraySharedSec = Convert.FromBase64String(sharedSec); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoS
static void Main(string[] args)
{
String sharedSec = "654A7EA2C9914A0B972937F4EA45FED3";
byte[] byteArraySharedSec = Convert.FromBase64String(sharedSec);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.KeySize = 192;
tdes.Key = byteArraySharedSec;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform ict = tdes.CreateEncryptor();
ICryptoTransform dct = tdes.CreateDecryptor();
Console.WriteLine("SharedSec: {0}", sharedSec);
Console.WriteLine("byteArraySharedSec: {0}\n", ToReadableByteArray(byteArraySharedSec));
long unixTimestamp = 1299481200;
byte[] unixTimestampByte = BitConverter.GetBytes(unixTimestamp);
Console.WriteLine("Timestamp: {0}, length: {1} ", ToReadableByteArray(unixTimestampByte), unixTimestampByte.Length);
byte[] result = ict.TransformFinalBlock(unixTimestampByte, 0, unixTimestampByte.Length);
Console.WriteLine("After 3DES encrypting: {0}, length {1}\n\n ", ToReadableByteArray(result), result.Length);
}
static public string ToReadableByteArray(byte[] bytes)
{
return string.Join(",", bytes);
}
输出(您可以看到byteArraySharedSec正确,但加密不正确):
SharedSec:654A7EA2C9914A0B972937F4EA45FED3
byteArraySharedSec:235158,0236,64,54,11223117224,13,1247189189223177120,16,14,57,20,64247
时间戳:112130116,77,0,0,0,0,长度:8
3DES加密后:
213,6018324417111620202205233,17226,8,70,9111,43,长度16
API文档给出了以下示例:
3DES加密使用:
- 192位密钥
- 欧洲央行模式
- PKCS7填充
- 通过Base64解码将共享密钥转换为字节数组。这是3DES键:{235、158、0236、64、54、11223、117、224、13、1247、189、189、223、177、120、16、14、57、20、64、247}
- 时间戳示例(2011年3月7日上午7点GMT):1299481200
- 3DES使用3DES密钥加密(ECB模式,PKCS7填充)时间戳:本例的128位(16字节)结果{82、191、213、179、179、73、1、218、247、68、254、199、19、159、1、138}
您加密的值与示例中给出的值不同 将
时间戳
视为字符串,并使用UTF8
编码来获取其字节表示,应该会得到相同的结果:
...
byte[] unixTimestampByte = Encoding.UTF8.GetBytes(unixTimestamp.ToString());
...
您加密的值与示例中给出的值不同 将
时间戳
视为字符串,并使用UTF8
编码来获取其字节表示,应该会得到相同的结果:
...
byte[] unixTimestampByte = Encoding.UTF8.GetBytes(unixTimestamp.ToString());
...
您可能加密的值与示例中给出的值不同。尝试将
时间戳
视为字符串,并使用UTF8
编码来获取其字节表示形式byte[]unixTimestampByte=Encoding.UTF8.GetBytes(unixTimestamp.ToString())代码>看看是否有什么不同…哈!就这样@IronGeek把这个评论写下来作为答案,我会接受的。3DES没有192位的密钥,它有一个168位的24字节的密钥,ewach字节的LSB被忽略。很高兴知道。我已经从代码中删除了“tdes.KeySize=192”。您可能加密的值与示例中给出的值不同。尝试将时间戳
视为字符串,并使用UTF8
编码来获取其字节表示形式byte[]unixTimestampByte=Encoding.UTF8.GetBytes(unixTimestamp.ToString())代码>看看是否有什么不同…哈!就这样@IronGeek把这个评论写下来作为答案,我会接受的。3DES没有192位的密钥,它有一个168位的24字节的密钥,ewach字节的LSB被忽略。很高兴知道。我已经从代码中删除了“tdes.KeySize=192”。谢谢。我会向第三方投诉他们的文件不清楚。谢谢。我会向第三方投诉他们的文件不清楚。