读书人

太苦闷了c与c#的des加/解密结果不一

发布时间: 2012-10-20 14:12:48 作者: rapoo

太郁闷了,c与c#的des加/解密结果不一致,而且是前8位不一致!!!
太郁闷了,c与c#的des加/解密结果不一致,而且是前8位不一致。高手们一起讨论讨论一下这篇c的des代码,看看是不是改动了什么?

c加密(用以下代码编译的库),c#解密(用DESCryptoServiceProvider),ecb模式,排除padding问题。

C/C++ code
#include "des.h"#define EN0   0   /* MODE == encrypt */#define DE1   1   /* MODE == decrypt */extern void deskey(unsigned long KnL[32], unsigned char *, short);/*                  hexkey[8]     MODE * Sets the internal key register according to the hexadecimal * key contained in the 8 bytes of hexkey, according to the DES, * for encryption or decryption according to mode. */extern void usekey(unsigned long KnL[32], unsigned long *);/*                cookedkey[32] * Loads the internal key register with the data in cookedkey. */extern void cpkey(unsigned long KnL[32], unsigned long *);/*               cookedkey[32] * Copies the contents of the internal key register into the storage * located at &cookedkey[0]. */extern void des(unsigned char *, unsigned char *);/*                from[8]         to[8] * Encrypts/Decrypts )according to the key currently loaded in the * internal key register) one block of eight bytes at address 'from' * into the block at address 'to'. They can be the same. */static void scrunch(unsigned char *, unsigned long *);static void unscrun(unsigned long *, unsigned char *);static void desfunc(unsigned long *, unsigned long *);static void cookey(unsigned long KnL[32], unsigned long *);//static unsigned long KnL[32] = { 0L };/*static unsigned long KnR[32] = { 0L };static unsigned long Kn3[32] = { 0L };static unsigned char Df_Key[24] = {         0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,         0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,         0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 };*/static const unsigned short bytebit[8] = {         0200, 0100, 040, 020, 010, 04, 02, 01 };static const unsigned long bigbyte[24] = {         0x800000L,    0x400000L,    0x200000L,    0x100000L,         0x80000L,     0x40000L,     0x20000L,     0x10000L,         0x8000L,      0x4000L,      0x2000L,      0x1000L,         0x800L,       0x400L,       0x200L,       0x100L,         0x80L,        0x40L,        0x20L,        0x10L,         0x8L,         0x4L,         0x2L,         0x1L    };/* Use the key schedule specified in the Standard (ANSI  X3.92-1981). */static const unsigned char pc1[56] = {         56, 48, 40, 32, 24, 16,  8,   0, 57, 49, 41, 33, 25, 17,          9,  1, 58, 50, 42, 34, 26,  18, 10,  2, 59, 51, 43, 35,         62, 54, 46, 38, 30, 22, 14,   6, 61, 53, 45, 37, 29, 21,         13,  5, 60, 52, 44, 36, 28,  20, 12,  4, 27, 19, 11,  3 };static const unsigned char totrot[16] = {         1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };static const unsigned char pc2[48] = {         13, 16, 10, 23,  0,  4,        2, 27, 14,  5, 20,  9,         22, 18, 11,  3, 25,  7,       15,  6, 26, 19, 12,  1,         40, 51, 30, 36, 46, 54,       29, 39, 50, 44, 32, 47,         43, 48, 38, 55, 33, 52,       45, 41, 49, 35, 28, 31 };         /* Thanks to James Gillogly & Phil Karn! */void deskey(unsigned long KnL[32], unsigned char *key, short edf){    register int i, j, l, m, n;    unsigned char pc1m[56], pcr[56];    unsigned long kn[32];    for( j = 0; j < 56; j++)    {        l = pc1[j];        m = l & 07;        pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;    }    for(


[解决办法]
太郁闷了,c与c#的des加/解密结果不一致,而且是前8位不一致。高手们一起讨论讨论一下这篇c的des代码,看看是不是改动了什么?

c加密(用以下代码编译的库),c#解密(用DESCryptoServiceProvider),ecb模式,排除padding问题。


哪个是正确的?

lz的意思是用c加密,然后用c#解密?

是加密的问题还是解密的问题?

读书人网 >C语言

热点推荐