gpt4 book ai didi

c# - c DES 和 C# DES 问题

转载 作者:行者123 更新时间:2023-11-30 15:45:31 27 4
gpt4 key购买 nike

我在整个网络上寻找这个问题,但找不到明确的答案:

我有一些使用 DESCryptoServiceProvider(Mode = CRC,Padding = none)的 C# 代码,并且我正在使用 openssl 库使用 C 来执行相同的操作。

到目前为止,C#

public static byte[] DESEncrypt(byte[] Source, byte[] Key)
{
byte[] DESKey = new byte[8];
Array.Copy(Key, 0, DESKey, 0, 8);

DisplayByteArray("DESKey", DESKey);

System.Security.Cryptography.DESCryptoServiceProvider DES = new System.Security.Cryptography.DESCryptoServiceProvider();
DES.Mode = System.Security.Cryptography.CipherMode.CBC;
byte[] IV = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
DES.IV = IV;
DES.Padding = System.Security.Cryptography.PaddingMode.None;
DES.Key = DESKey;

System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, DES.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);

cs.Write(Source, 0, Source.Length);

byte[] outdata = ms.ToArray();

cs.Close();
ms.Close();

return outdata;
}

和 C 语言

int DesEncrypt(BYTE *pOriginal, BYTE *oEncrypted, int nDataLength, BYTE *pKey)
{
DES_cblock ivec = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
DES_cblock key[8];
memcpy(key,&pKey[0], 8);
memset(oEncrypted, 0, sizeof(oEncrypted));
printf("\nDESkey: ");DisplayByteArray((BYTE *)&key[0], 8);
DES_key_schedule ks;
memcpy((DES_cblock *)key, &ks, 8);
if (DES_set_key_checked((DES_cblock *)key, &ks))
printf("\nChecked OKAY");
else
printf("\nCheck FAILED");
DES_cbc_encrypt(pOriginal, oEncrypted, nDataLength, &ks, &ivec, DES_ENCRYPT);
}

我做错了什么?

最佳答案

我认为遵循以下路线

DES_cblock key[8];

应该是

DES_cblock key;

因为您使用的是单 key 。

一个大问题是

memcpy((DES_cblock *)key, &ks, 8);
if (DES_set_key_checked((DES_cblock *)key, &ks))
printf("\nChecked OKAY");
else
printf("\nCheck FAILED");

不要通过ks memcpy key。您的 ks 尚未初始化。DES_set_key_checked 从 key 设置 key 时间表。

memcpy 不应在 DES_set_key_checked 之前出现。

应该是

if (DES_set_key_checked((DES_cblock *)key, &ks))
printf("\nChecked OKAY");
else
printf("\nCheck FAILED");

除非您确定这样做的原因,否则不要进行类型转换。显式类型转换可以隐藏许多错误。

关于c# - c DES 和 C# DES 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18976721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com