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

我的C#3DES加密与我使用的第三方API不匹配。我的代码有什么问题吗

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填充

共享机密示例:654A7EA2C9914A0B972937F4EA45FED3

  • 通过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”。谢谢。我会向第三方投诉他们的文件不清楚。谢谢。我会向第三方投诉他们的文件不清楚。