我在整个网络上都在寻找这个问题,但却找不到明确的答案:
我有一些C#代码使用DESCryptoServiceProvider (Mode = CRC,have = to ),我使用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);
}我做错了什么?
发布于 2013-09-24 08:57:57
我想下面这句话
DES_cblock key[8];应该是
DES_cblock key;因为你用的是单键。
其中一个大问题是
memcpy((DES_cblock *)key, &ks, 8);
if (DES_set_key_checked((DES_cblock *)key, &ks))
printf("\nChecked OKAY");
else
printf("\nCheck FAILED");不要通过key ks。您的ks未初始化。DES_set_key_checked从密钥设置密钥调度。
在DES_set_key_checked之前,memcpy不应该存在。
它应该是
if (DES_set_key_checked((DES_cblock *)key, &ks))
printf("\nChecked OKAY");
else
printf("\nCheck FAILED");除非你知道你在做什么,否则不要打打字机。显式类型广播可以隐藏许多错误。
https://stackoverflow.com/questions/18976721
复制相似问题