/* des: duplicate the NBS Data Encryption Standard in software.
 * usage: des <file>
 * prompts for the password
 * If the filename ends in ".n" it will be decrypted with the key;
 * otherwise it will be encrypted.
 *
 * Permutation algorithm:
 *    The permutation is defined by its effect on each of the 16 nibbles
 *    of the 64-bit input.  For each nibble we give an 8-byte bit array
 *    that has the bits in the input nibble distributed correctly.  The
 *    complete permutation involves ORing the 16 sets of 8 bytes designated
 *    by the 16 input nibbles.  Uses 16*16*8 = 2K bytes of storage for
 *    each 64-bit permutation.  32-bit permutations (P) and expansion (E)
 *    are done similarly, but using bytes instead of nibbles.
 *    Should be able to use long ints, adding the masks, at a
 *    later pass.  Tradeoff: can speed 64-bit perms up at cost of slowing 
 *    down expansion or contraction operations by using 8K tables here and
 *    decreasing the size of the other tables.
 * The compressions are pre-computed in 12-bit chunks, combining 2 of the
 *    6->4 bit compressions.
 * The key schedule is also precomputed.
 * Compile with VALIDATE defined to run the NBS validation suite.
 *
 * Jim Gillogly, May 1977
 * Modified 8/84 by Jim Gillogly and Lauren Weinstein to compile with
 *   post-1977 C compilers and systems
 *
 * This program is now officially in the public domain, and is available for
 * any non-profit use as long as the authorship line is retained.
 */#include <stdio.h>char iperm[16][16][8],fperm[16][16][8]; /* inital and final permutations*/
char s[4][4096]; /* S1 thru S8 precomputed */
char p32[4][256][4]; /* for permuting 32-bit f output*/
char kn[16][6]; /* key selections */endes(inblock,outblock) /* encrypt 64-bit inblock */
char *inblock, *outblock;
{ char iters[17][8]; /* workspace for each iteration */
char swap[8]; /* place to interchange L and R */
register int i;
register char *s, *t; permute(inblock,iperm,iters[0]);/* apply initial permutation */
for (i=0; i<16; i++) /* 16 churning operations */
iter(i,iters[i],iters[i+1]);
/* don't re-copy to save space  */
s = swap; t = &iters[16][4]; /* interchange left */
*s++ = *t++; *s++ = *t++; *s++ = *t++; *s++ = *t++;
t = &iters[16][0]; /* and right */
*s++ = *t++; *s++ = *t++; *s++ = *t++; *s++ = *t++;
permute(swap,fperm,outblock);   /* apply final permutation */
}dedes(inblock,outblock) /* decrypt 64-bit inblock */
char *inblock,*outblock;
{ char iters[17][8]; /* workspace for each iteration */
char swap[8]; /* place to interchange L and R */
register int i;
register char *s, *t; permute(inblock,iperm,iters[0]);/* apply initial permutation */
for (i=0; i<16; i++) /* 16 churning operations */
iter(15-i,iters[i],iters[i+1]);
/* reverse order from encrypting*/
s = swap; t = &iters[16][4]; /* interchange left */
*s++ = *t++; *s++ = *t++; *s++ = *t++; *s++ = *t++;
t = &iters[16][0]; /* and right */
*s++ = *t++; *s++ = *t++; *s++ = *t++; *s++ = *t++;
permute(swap,fperm,outblock);   /* apply final permutation */
}permute(inblock,perm,outblock) /* permute inblock with perm */
char *inblock, *outblock; /* result into outblock,64 bits */
char perm[16][16][8]; /* 2K bytes defining perm. */
{ register int i,j;
register char *ib, *ob; /* ptr to input or output block */
register char *p, *q; for (i=0, ob = outblock; i<8; i++)
*ob++ = 0; /* clear output block */
ib = inblock;
for (j = 0; j < 16; j += 2, ib++) /* for each input nibble */
{ ob = outblock;
p = perm[j][(*ib >> 4) & 017];
q = perm[j + 1][*ib & 017];
for (i = 0; i < 8; i++)   /* and each output byte */
*ob++ |= *p++ | *q++;   /* OR the masks together*/
}
}

解决方案 »

  1.   

    char ip[] /* initial permutation P */
    = { 58, 50, 42, 34, 26, 18, 10,  2,
    60, 52, 44, 36, 28, 20, 12,  4,
    62, 54, 46, 38, 30, 22, 14,  6,
    64, 56, 48, 40, 32, 24, 16,  8,
    57, 49, 41, 33, 25, 17,  9,  1,
    59, 51, 43, 35, 27, 19, 11,  3,
    61, 53, 45, 37, 29, 21, 13,  5,
    63, 55, 47, 39, 31, 23, 15,  7 };char fp[] /* final permutation F   */
    = { 40,  8, 48, 16, 56, 24, 64, 32,
    39,  7, 47, 15, 55, 23, 63, 31,
    38,  6, 46, 14, 54, 22, 62, 30,
    37,  5, 45, 13, 53, 21, 61, 29,
    36,  4, 44, 12, 52, 20, 60, 28,
    35,  3, 43, 11, 51, 19, 59, 27,
    34,  2, 42, 10, 50, 18, 58, 26,
    33,  1, 41,  9, 49, 17, 57, 25 };/* expansion operation matrix   */ /* rwo: unused */
    /* char ei[] = { 32,  1,  2,  3,  4,  5,
     4,  5,  6,  7,  8,  9,
     8,  9, 10, 11, 12, 13,
    12, 13, 14, 15, 16, 17,
    16, 17, 18, 19, 20, 21,
    20, 21, 22, 23, 24, 25,
    24, 25, 26, 27, 28, 29,
    28, 29, 30, 31, 32,  1  }; */char pc1[] /* permuted choice table (key)  */
    = { 57, 49, 41, 33, 25, 17,  9,
     1, 58, 50, 42, 34, 26, 18,
    10,  2, 59, 51, 43, 35, 27,
    19, 11,  3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15,
     7, 62, 54, 46, 38, 30, 22,
    14,  6, 61, 53, 45, 37, 29,
    21, 13,  5, 28, 20, 12,  4 };char totrot[]    /* number left rotations of pc1 */
    = { 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };char pc1m[56];   /* place to modify pc1 into */
    char pcr[56];    /* place to rotate pc1 into */char pc2[] /* permuted choice key (table)  */
    = { 14, 17, 11, 24,  1,  5,
     3, 28, 15,  6, 21, 10,
    23, 19, 12,  4, 26,  8,
    16,  7, 27, 20, 13,  2,
    41, 52, 31, 37, 47, 55,
    30, 40, 51, 45, 33, 48,
    44, 49, 39, 56, 34, 53,
    46, 42, 50, 36, 29, 32 };char si[8][64]   /* 48->32 bit compression tables*/
    = { /* S[1]  */
    14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
     0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
     4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
    15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
    /* S[2]  */
    15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
     3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
     0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
    13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
    /* S[3]  */
    10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
    13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
    13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
     1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
    /* S[4]  */
     7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
    13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
    10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
     3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
    /* S[5]  */
     2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
    14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
     4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
    11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
    /* S[6]  */
    12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
    10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
     9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
     4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
    /* S[7]  */
     4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
    13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
     1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
     6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
    /* S[8]  */
    13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
     1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
     7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
     2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 };char p32i[] /* 32-bit permutation function  */
    = { 16,  7, 20, 21,
    29, 12, 28, 17,
     1, 15, 23, 26,
     5, 18, 31, 10,
     2,  8, 24, 14,
    32, 27,  3,  9,
    19, 13, 30,  6,
    22, 11,  4, 25 };desinit(key) /* initialize all des arrays */
    char *key;
    {
    #ifdef DEBUG
    /*deb*/ printf("Initial perm init.\n");
    #endif
    perminit(iperm,ip); /* initial permutation */
    #ifdef DEBUG
    /*deb*/ printf("Final perm init.\n");
    #endif
    perminit(fperm,fp); /* final permutation */
    #ifdef DEBUG
    /*deb*/ printf("Key sched init.\n");
    #endif
    kinit(key); /* key schedule */
    #ifdef DEBUG
    /*deb*/ printf("Compression init.\n");
    #endif
    sinit(); /* compression functions */#ifdef DEBUG
    /*deb*/ printf("32-bit perm init.\n");
    #endif
    p32init(); /* 32-bit permutation in f */
    #ifdef DEBUG
    /*deb*/ printf("End init.\n");
    #endif
    }
      

  2.   

    int bytebit[]    /* bit 0 is left-most in byte */
    = { 0200,0100,040,020,010,04,02,01 };int nibblebit[] = { 010,04,02,01 };sinit()  /* initialize s1-s8 arrays */
    { register int i,j; for (i=0; i<4; i++) /* each 12-bit position */
    for (j=0; j<4096; j++)  /* each possible 12-bit value   */
    s[i][j]=(getcomp(i*2,j>>6)<<4) |
    (017&getcomp(i*2+1,j&077));
    /* store 2 compressions per char*/
    }getcomp(k,v) /* 1 compression value for sinit*/
    int k,v;
    { register int i,j; /* correspond to i and j in FIPS*/ i=((v&040)>>4)|(v&1); /* first and last bits make row */
    j=(v&037)>>1; /* middle 4 bits are column */
    return (int) si[k][(i<<4)+j];   /* result is ith row, jth col   */
    }kinit(key) /* initialize key schedule array*/
    char *key; /* 64 bits (will use only 56)   */
    { register int i,j,l;
    int m; for (j=0; j<56; j++) /* convert pc1 to bits of key   */
    { l=pc1[j]-1; /* integer bit location */
    m = l & 07; /* find bit */
    pc1m[j]=(key[l>>3] & /* find which key byte l is in  */
    bytebit[m]) /* and which bit of that byte   */
    ? 1 : 0; /* and store 1-bit result */
    }
    for (i=0; i<16; i++) /* for each key sched section   */
    for (j=0; j<6; j++) /* and each byte of the kn */
    kn[i][j]=0; /* clear it for accumulation */
    for (i=0; i<16; i++) /* key chunk for each iteration */
    { for (j=0; j<56; j++) /* rotate pc1 the right amount  */
    pcr[j] = pc1m[(l=j+totrot[i])<(j<28? 28 : 56) ? l: l-28];
    /* rotate left and right halves independently   */
    for (j=0; j<48; j++) /* select bits individually */
    if (pcr[pc2[j]-1]) /* check bit that goes to kn[j] */
    { l= j & 07;
    kn[i][j>>3] |= bytebit[l];
    } /* mask it in if it's there */
    }
    }p32init() /* initialize 32-bit permutation*/
    { register int l, j, k;
    int i,m; for (i=0; i<4; i++) /* each input byte position */
    for (j=0; j<256; j++) /* all possible input bytes */
    for (k=0; k<4; k++) /* each byte of the mask */
    p32[i][j][k]=0; /* clear permutation array */
    for (i=0; i<4; i++) /* each input byte position */
    for (j=0; j<256; j++) /* each possible input byte */
    for (k=0; k<32; k++) /* each output bit position */
    {   l=p32i[k]-1; /* invert this bit (0-31) */
    if ((l>>3)!=i) /* does it come from input posn?*/
    continue; /* if not, bit k is 0 */
    if (!(j&bytebit[l&07]))
    continue; /* any such bit in input? */
    m = k & 07;  /* which bit is it? */
    p32[i][j][k>>3] |= bytebit[m];
    }
    }perminit(perm,p) /* initialize a perm array */
    char perm[16][16][8]; /* 64-bit, either init or final */
    char p[64];
    { register int l, j, k;
    int i,m; for (i=0; i<16; i++) /* each input nibble position   */
    for (j=0; j<16; j++) /* all possible input nibbles   */
    for (k=0; k<8; k++) /* each byte of the mask */
    perm[i][j][k]=0;/* clear permutation array */
    for (i=0; i<16; i++) /* each input nibble position   */
    for (j = 0; j < 16; j++)/* each possible input nibble   */
    for (k = 0; k < 64; k++)/* each output bit position */
    {   l = p[k] - 1; /* where does this bit come from*/
    if ((l >> 2) != i)  /* does it come from input posn?*/
    continue; /* if not, bit k is 0 */
    if (!(j & nibblebit[l & 3]))
    continue; /* any such bit in input? */
    m = k & 07; /* which bit is this in the byte*/
    perm[i][j][k>>3] |= bytebit[m];
    }
    }iter(num,inblock,outblock) /* 1 churning operation */
    int num; /* i.e. the num-th one */
    char *inblock, *outblock; /* 64 bits each */
    { char fret[4]; /* return from f(R[i-1],key) */
    register char *ib, *ob, *fb;
    /* register int i; */ /* rwo: unused */ ob = outblock; ib = &inblock[4];
    f(ib, num, fret); /* the primary transformation   */
    *ob++ = *ib++; /* L[i] = R[i-1] */
    *ob++ = *ib++;
    *ob++ = *ib++;
    *ob++ = *ib++;
    ib = inblock; fb = fret; /* R[i]=L[i] XOR f(R[i-1],key)  */
    *ob++ = *ib++ ^ *fb++;
    *ob++ = *ib++ ^ *fb++;
    *ob++ = *ib++ ^ *fb++;
    *ob++ = *ib++ ^ *fb++;
    }f(right,num,fret) /* critical cryptographic trans */
    char *right, *fret; /* 32 bits each */
    int num; /* index number of this iter */
    { register char *kb, *rb, *bb; /* ptr to key selection &c */
    char bigright[6]; /* right expanded to 48 bits */
    char result[6]; /* expand(R) XOR keyselect[num] */
    char preout[4]; /* result of 32-bit permutation */ kb = kn[num]; /* fast version of iteration */
    bb = bigright;
    rb = result;
    expand(right,bb); /* expand to 48 bits */
    *rb++ = *bb++ ^ *kb++; /* expanded R XOR chunk of key  */
    *rb++ = *bb++ ^ *kb++;
    *rb++ = *bb++ ^ *kb++;
    *rb++ = *bb++ ^ *kb++;
    *rb++ = *bb++ ^ *kb++;
    *rb++ = *bb++ ^ *kb++;
    contract(result,preout); /* use S fns to get 32 bits */
    perm32(preout,fret); /* and do final 32-bit perm */
    }perm32(inblock,outblock) /* 32-bit permutation at end */
    char *inblock,*outblock; /* of the f crypto function */
    { register int j;
    /* register int i; */ /* rwo: unused */
    register char *ib, *ob;
    register char *q; ob = outblock; /* clear output block */
    *ob++ = 0; *ob++ = 0; *ob++ = 0; *ob++ = 0;
    ib=inblock; /* ptr to 1st byte of input */
    for (j=0; j<4; j++, ib++) /* for each input byte */
    { q = p32[j][*ib & 0377];
    ob = outblock; /* and each output byte */
    *ob++ |= *q++; /* OR the 16 masks together */
    *ob++ |= *q++;
    *ob++ |= *q++;
    *ob++ |= *q++;
    }
    }expand(right,bigright) /* 32 to 48 bits with E oper */
    char *right,*bigright; /* right is 32, bigright 48 */
    {
    register char *bb, *r, r0, r1, r2, r3; bb = bigright;
    r = right; r0 = *r++; r1 = *r++; r2 = *r++; r3 = *r++;
    *bb++ = ((r3 & 0001) << 7) | /* 32 */
    ((r0 & 0370) >> 1) | /* 1 2 3 4 5 */
    ((r0 & 0030) >> 3); /* 4 5 */
    *bb++ = ((r0 & 0007) << 5) | /* 6 7 8 */
    ((r1 & 0200) >> 3) | /* 9 */
    ((r0 & 0001) << 3) | /* 8 */
    ((r1 & 0340) >> 5); /* 9 10 11 */
    *bb++ = ((r1 & 0030) << 3) | /* 12 13 */
    ((r1 & 0037) << 1) | /* 12 13 14 15 16 */
    ((r2 & 0200) >> 7); /* 17 */
    *bb++ = ((r1 & 0001) << 7) | /* 16 */
    ((r2 & 0370) >> 1) | /* 17 18 19 20 21 */
    ((r2 & 0030) >> 3); /* 20 21 */
    *bb++ = ((r2 & 0007) << 5) | /* 22 23 24 */
    ((r3 & 0200) >> 3) | /* 25 */
    ((r2 & 0001) << 3) | /* 24 */
    ((r3 & 0340) >> 5); /* 25 26 27 */
    *bb++ = ((r3 & 0030) << 3) | /* 28 29 */
    ((r3 & 0037) << 1) | /* 28 29 30 31 32 */
    ((r0 & 0200) >> 7); /* 1 */
    }contract(in48,out32) /* contract f from 48 to 32 bits*/
    char *in48,*out32; /* using 12-bit pieces into bytes */
    { register char *c;
    register char *i;
    register int i0, i1, i2, i3, i4, i5; i = in48;
    i0 = *i++; i1 = *i++; i2 = *i++; i3 = *i++; i4 = *i++; i5 = *i++;
    c = out32; /* do output a byte at a time   */
    *c++ = s[0][07777 & ((i0 << 4) | ((i1 >> 4) & 017  ))];
    *c++ = s[1][07777 & ((i1 << 8) | ( i2 & 0377 ))];
    *c++ = s[2][07777 & ((i3 << 4) | ((i4 >> 4) & 017  ))];
    *c++ = s[3][07777 & ((i4 << 8) | ( i5 & 0377 ))];
    }/* End of DES algorithm (except for calling desinit below) */
      

  3.   

    放在unsafe代码块里能编译吗,如果可以的话,就这样好了。
    参见:
    http://msdn.microsoft.com/en-us/library/chfa2zb8(VS.71).aspx
    如果不行的话,就是用vc.net创建一个dll工程,把代码放进去,编译成dll.export合适的interface.再在C#里面使用Platform Invoke调用
    参见:
    Platform Invoke Tutorial (C#)
    http://msdn.microsoft.com/en-us/library/aa288468.aspx
      

  4.   


    #region TripleDES加密        /// <summary>
            /// 使用TripleDESCryptoServiceProvider加密
            /// </summary>
            /// <param name="Data">待转换数据</param>
            /// <param name="Key"></param>
            /// <param name="IV"></param>
            /// <returns></returns>
            public static byte[] TriDesEncrypt(byte[] Data, byte[] Key, byte[] IV)
            {
                try
                {
                    MemoryStream ms = new MemoryStream();
                    ICryptoTransform cTrans = new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV);
                    byte[] result = cTrans.TransformFinalBlock(Data, 0, Data.Length);
                    return result;
                }
                catch //(CryptographicException e)
                {
                    return null;
                }
            }        /// <summary>
            /// 使用TripleDESCryptoServiceProvider解密
            /// </summary>
            /// <param name="Data"></param>
            /// <param name="Key"></param>
            /// <param name="IV"></param>
            /// <returns></returns>
            public static byte[] TriDesDecrypt(byte[] Data, byte[] Key, byte[] IV)
            {
                try
                {
                    ICryptoTransform cTrans = new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV);
                    byte[] result = cTrans.TransformFinalBlock(Data, 0, Data.Length);
                    return result;
                }
                catch// (CryptographicException e)
                {
                    return null;
                }
            }
            #endregion
    我用DES的时候是把KEY值和IV值单独存放,不知道你的需求是什么,是不是怕加解密模块被反编?如果是这样,你可以用软件混淆一下,或者采用私钥加密,公钥解密的方法        #region RSA大整数加密        /* 
             功能:用指定的私钥(n,d)加密指定字符串source 
            */
            public static string EncryptString(string source, BigInteger d, BigInteger n)
            {
                int len = source.Length;
                int len1 = 0;
                int blockLen = 0;
                if ((len % 128) == 0)
                    len1 = len / 128;
                else
                    len1 = len / 128 + 1;
                string block = "";
                string temp = "";
                for (int i = 0; i < len1; i++)
                {
                    if (len >= 128)
                        blockLen = 128;
                    else
                        blockLen = len;
                    block = source.Substring(i * 128, blockLen);
                    byte[] oText = System.Text.Encoding.UTF8.GetBytes(block);
                    BigInteger biText = new BigInteger(oText);
                    BigInteger biEnText = biText.modPow(d, n);
                    string temp1 = biEnText.ToHexString();
                    temp += temp1;
                    len -= blockLen;
                }
                return temp;
            }        /* 
             功能:用指定的公钥(n,e)解密指定字符串source 
            */
            public static string DecryptString(string source, BigInteger e, BigInteger n)
            {
                int len = source.Length;
                int len1 = 0;
                int blockLen = 0;
                if ((len % 256) == 0)
                    len1 = len / 256;
                else
                    len1 = len / 256 + 1;
                string block = "";
                string temp = "";
                for (int i = 0; i < len1; i++)
                {
                    if (len >= 256)
                        blockLen = 256;
                    else
                        blockLen = len;
                    block = source.Substring(i * 256, blockLen);
                    BigInteger biText = new BigInteger(block, 16);
                    BigInteger biEnText = biText.modPow(e, n);
                    string temp1 = System.Text.Encoding.UTF8.GetString(biEnText.getBytes());
                    temp += temp1;
                    len -= blockLen;
                }
                return temp;
            }        /* 
             加密过程,其中d、n是RSACryptoServiceProvider生成的D、Modulus 
             */
            public static string EncryptProcess(string source, byte[] d, byte[] n)
            {
                BigInteger biN = new BigInteger(n);
                BigInteger biD = new BigInteger(d);
                return EncryptString(source, biD, biN);
            }        /* 
             解密过程,其中e、n是RSACryptoServiceProvider生成的Exponent、Modulus 
            */
            public static string DecryptProcess(string source, byte[] e, byte[] n)
            {
                BigInteger biN = new BigInteger(n);
                BigInteger biE = new BigInteger(e);
                return DecryptString(source, biE, biN);
            }
            #endregion
    BigInteger类太大,我就不贴了,如果你需要,可以在网上搜搜,或者联系我,我传给你
      

  5.   

    ?????????
    DES算法,是公开算法,net框架里本身就有DES算法加密算法的基本准则,就是算法公开而且相对不变,加密强度只与密钥相关给你个net下DES的例子 public class DES
        {
            public static string key = "Iwhovxye";  //默认初始key值
            public static string  IV = "12345678";  //默认初始向量值
            byte[] m_key;
            byte[] m_iv;
            public DES()
            {
                this.m_key = Encoding.UTF8.GetBytes(key);
                this.m_iv = Encoding.UTF8.GetBytes(IV);
                if (m_key.Length != 8 || m_iv.Length != 8)
                {
                    throw new Exception("参数位数不符");
                }
                
            }
            /// <summary>
            /// DES双向加密类,key:64位密钥;IV:64位初始向量
            /// </summary>
            /// <param name="key">8字符,64位密钥</param>
            /// <param name="IV">8字符,64位初始向量</param>
            public DES(string key,string IV)
            {
                this.m_key = Encoding.UTF8.GetBytes(key);
                this.m_iv = Encoding.UTF8.GetBytes(IV);
                if (m_key.Length!=8 ||m_iv.Length!=8)
                {
                    throw new Exception("参数位数不符");
                }
               
            }        /// <summary>
            /// des加密
            /// </summary>
            /// <param name="value">待加密明文</param>
            /// <returns>返回base64编码的密文</returns>        public string Encrypt(string value)
            {
                byte[] inputArr = System.Text.Encoding.UTF8.GetBytes(value);
                using (MemoryStream ms = new MemoryStream())
                {                DESCryptoServiceProvider objDes = new DESCryptoServiceProvider();                using (CryptoStream cStream = new CryptoStream(ms,
                      objDes.CreateEncryptor(m_key, m_iv),
                      CryptoStreamMode.Write))
                    {
                        cStream.Write(inputArr, 0, inputArr.Length);
                        cStream.FlushFinalBlock();
                        byte[] s = ms.ToArray();                    string res = Convert.ToBase64String(s);
                        return res;
                    }
                }
            }
            /// <summary>
            /// des解密
            /// </summary>
            /// <param name="value">base64编码密文</param>
            /// <returns>UTF8编码明文</returns>        public string Decrypt(string value)
            {
          
                byte[] sde = Convert.FromBase64String(value);            using (MemoryStream ms1 = new MemoryStream())
                {
                    DESCryptoServiceProvider objDes = new DESCryptoServiceProvider();
                    using (CryptoStream cs = new CryptoStream(ms1, objDes.CreateDecryptor(m_key, m_iv), CryptoStreamMode.Write))
                    {
                        cs.Write(sde, 0, sde.Length);
                        cs.FlushFinalBlock();
                        byte[] dres = ms1.ToArray();
                        string d = System.Text.Encoding.UTF8.GetString(dres);
                        return d;
                    }            }        }    }
      

  6.   

     public class DES
        {
            public static string key = "Iwhovxye";  //默认初始key值
            public static string  IV = "12345678";  //默认初始向量值
            byte[] m_key;
            byte[] m_iv;
            public DES()
            {
                this.m_key = Encoding.UTF8.GetBytes(key);
                this.m_iv = Encoding.UTF8.GetBytes(IV);
                if (m_key.Length != 8 || m_iv.Length != 8)
                {
                    throw new Exception("参数位数不符");
                }
                
            }
            /// <summary>
            /// DES双向加密类,key:64位密钥;IV:64位初始向量
            /// </summary>
            /// <param name="key">8字符,64位密钥</param>
            /// <param name="IV">8字符,64位初始向量</param>
            public DES(string key,string IV)
            {
                this.m_key = Encoding.UTF8.GetBytes(key);
                this.m_iv = Encoding.UTF8.GetBytes(IV);
                if (m_key.Length!=8 ||m_iv.Length!=8)
                {
                    throw new Exception("参数位数不符");
                }
               
            }        /// <summary>
            /// des加密
            /// </summary>
            /// <param name="value">待加密明文</param>
            /// <returns>返回base64编码的密文</returns>        public string Encrypt(string value)
            {
                byte[] inputArr = System.Text.Encoding.UTF8.GetBytes(value);
                using (MemoryStream ms = new MemoryStream())
                {                DESCryptoServiceProvider objDes = new DESCryptoServiceProvider();                using (CryptoStream cStream = new CryptoStream(ms,
                      objDes.CreateEncryptor(m_key, m_iv),
                      CryptoStreamMode.Write))
                    {
                        cStream.Write(inputArr, 0, inputArr.Length);
                        cStream.FlushFinalBlock();
                        byte[] s = ms.ToArray();                    string res = Convert.ToBase64String(s);
                        return res;
                    }
                }
            }
            /// <summary>
            /// des解密
            /// </summary>
            /// <param name="value">base64编码密文</param>
            /// <returns>UTF8编码明文</returns>        public string Decrypt(string value)
            {
          
                byte[] sde = Convert.FromBase64String(value);            using (MemoryStream ms1 = new MemoryStream())
                {
                    DESCryptoServiceProvider objDes = new DESCryptoServiceProvider();
                    using (CryptoStream cs = new CryptoStream(ms1, objDes.CreateDecryptor(m_key, m_iv), CryptoStreamMode.Write))
                    {
                        cs.Write(sde, 0, sde.Length);
                        cs.FlushFinalBlock();
                        byte[] dres = ms1.ToArray();
                        string d = System.Text.Encoding.UTF8.GetString(dres);
                        return d;
                    }            }        }    }
      

  7.   

    其实我也知道.Net Framework内包含此类机密算法可是不知怎么的总是无法做出我要的效果.比如:使用我提供的C代码加密数据 {0x90, 0x1f, 0x03, 0x00, 0x05, 0x08, 0x10, 0x00 } 使用密钥 { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 } 得到密文 { 0xA6 0x74 0xEE 0xAE 0xDC 0xB6 0xFC 0xA4 }.但是我用.Net Framework内置的加密算法无法得到与之相同的结果,所以请大家帮帮忙.如果不用将上面提到的C代码转换为C#代码也能做到当然最好,如果不行还请指教如何转换该C代码才能达到同样的效果.谢谢各位
      

  8.   


    C# Desc加密算法
    使用注意事项:sKey要为8位,或16位字符using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;public class DesSecurity
    {/// <summary>
    /// 加密原函数
    /// </summary>
    /// <param name="pToEncrypt"></param>
    /// <param name="sKey"></param>
    /// <returns></returns>
    public string DesEncrypt(string pToEncrypt, string sKey)
    {
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
    cs.Write(inputByteArray, 0, inputByteArray.Length);
    cs.FlushFinalBlock();
    StringBuilder ret = new StringBuilder();
    foreach (byte b in ms.ToArray())
    {
    ret.AppendFormat("{0:X2}", b);
    }
    ret.ToString();
    return ret.ToString();
    //return a;
    }
    /// <summary>
    /// 解密原函数
    /// </summary>
    /// <param name="pToDecrypt"></param>
    /// <param name="sKey"></param>
    /// <returns></returns>
    public string DesDecrypt(string pToDecrypt, string sKey)
    {
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
    for (int x = 0; x < pToDecrypt.Length / 2; x++)
    {
    int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
    inputByteArray[x] = (byte)i;
    }
    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
    cs.Write(inputByteArray, 0, inputByteArray.Length);
    cs.FlushFinalBlock();
    StringBuilder ret = new StringBuilder();
    return System.Text.Encoding.Default.GetString(ms.ToArray());
    }}
      

  9.   

    to:zzxap 非常感谢你回复,不过我好像没有搞懂怎么使用哈。我这样调用的时候报错
    Console.WriteLine(DesSecurity.DesEncrypt("901f030005081000", "8888888888888888"));---
    The following error occurred while executing the snippet:
    System.ArgumentException: Specified key is not a valid size for this algorithm.
       at System.Security.Cryptography.DES.set_Key(Byte[] value)
       at DesSecurity.DesEncrypt(String pToEncrypt, String sKey)
       at MyClass.RunSnippet()
       at MyClass.Main()
    ---
      

  10.   

    to:zzxap我现在修改为
    Console.WriteLine(DesSecurity.DesEncrypt("901f0300", "88888888")); 能成功调用了
    可是得到的数据长度不一样,密文应该和原来一样长的
      

  11.   

    to:zzxap 在不在??问题还没有解决,请帮帮忙
      

  12.   

    这里有段AES的片段
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;namespace TAIS.WrapClass.BLL
    {
        public class SecurityHelper
        {
            private static SymmetricAlgorithm encryptAlgorithm = new RijndaelManaged();        /// <summary>
            /// 加密
            /// </summary>
            /// <param name="byteIn">要加密的数组</param>
            /// <param name="Key">密钥</param>
            /// <param name="IV">自增向量</param>
            /// <returns>加密后的数组</returns>
            public static byte[] Encrypt(byte[] byteIn, byte[] Key, byte[] IV)
            {
                encryptAlgorithm.Key = Key;
                encryptAlgorithm.IV = IV;            ICryptoTransform encryptTransform = encryptAlgorithm.CreateEncryptor();
                MemoryStream ioStream = new MemoryStream();            CryptoStream encryptStream = new CryptoStream(ioStream, encryptTransform, CryptoStreamMode.Write);            //加密文件,更新缓冲区
                encryptStream.Write(byteIn, 0, byteIn.Length);
                encryptStream.FlushFinalBlock();
                //获得结果
                return ioStream.ToArray();
            }        /// <summary>
            /// 解密
            /// </summary>
            /// <param name="byteIn">要加密的数组</param>
            /// <param name="Key">密钥</param>
            /// <param name="IV">自增向量</param>
            /// <returns>解密后的数组</returns>
            public static byte[] Decrypt(byte[] byteIn, byte[] Key, byte[] IV)
            {
                encryptAlgorithm.Key = Key;
                encryptAlgorithm.IV = IV;            ICryptoTransform encryptTransform = encryptAlgorithm.CreateDecryptor();
                MemoryStream ioStream = new MemoryStream();            CryptoStream encryptStream = new CryptoStream(ioStream, encryptTransform, CryptoStreamMode.Write);            encryptStream.Write(byteIn, 0, byteIn.Length);
                encryptStream.FlushFinalBlock();            //获得结果
                return ioStream.ToArray();
            }        /// <summary>
            /// 生成密钥
            /// </summary>
            /// <returns>密钥数组</returns>
            public static byte[] GenKey()
            {
                return GetRandomBytes(32);
            }        /// <summary>
            /// 生成自增向量
            /// </summary>
            /// <returns>自增向量数组</returns>
            public static byte[] GenIV()
            {
                return GetRandomBytes(16);
            }        private static byte[] GetRandomBytes(int length)
            {
                RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
                byte[] byteOut = new byte[length];
                random.GetBytes(byteOut);
                return byteOut;
            }
        }
    }
      

  13.   

    .NET内置的加密算法,但我没看见你所说的哪里不满足需求?
            SymmetricAlgorithm[] Encrypts = new SymmetricAlgorithm[]{
                                                                        //DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;DESCryptoServiceProvider
                                                                        new DESCryptoServiceProvider(), 
                                                                        //RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快;
                                                                        new RC2CryptoServiceProvider(), 
                                                                        //高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法; 
                                                                        new RijndaelManaged(), 
                                                                        //是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
                                                                        new TripleDESCryptoServiceProvider() ,
                                                                    };
      

  14.   

    www.pudn.com
    这个网站有代码
      

  15.   


    我没有别的需求就是希望加解密是得到下面类型的数据,可是还是无法从.Net 内置的算法中的得到同样的结果,不信请使用下面的数据进行加密。比如:使用我提供的C代码加密数据 {0x90, 0x1f, 0x03, 0x00, 0x05, 0x08, 0x10, 0x00 } 使用密钥 { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 } 得到密文 { 0xA6 0x74 0xEE 0xAE 0xDC 0xB6 0xFC 0xA4 }. 
      

  16.   

    大家帮帮忙吧,还有提供下载网址的朋友,www.pudn.com 是个收费网站而且内容也不全
      

  17.   

    看到这个帖子有点晚了啊,不过还是回复一下,可能对以后的人有用哦~~
    C#提供的DES加密的类无法重现或者解密你用C写的DES加密的方法,是因为IV这个参数。众所周知,基本的DES加密算法只需要使用一个密钥就可以完成加密的操作,正如楼主在C代码中表示的一样。
    但在.net平台上,为了提高加密的安全性,微软在DES加密中采用了一种叫做密码块链 (CBC) 的链模式,它使用一个密钥和一个初始化向量 (IV) 对数据执行加密转换。对于给定的密钥 k,一个不使用初始化向量的简单块密码,将把相同的明文输入块,加密为同样的密文输出块。如果在明文流中有重复的块,那么在密文流中将存在重复的块。如果未经授权的用户知道有关明文块的结构的任何信息,就可以使用这些信息解密已知的密文块并有可能发现您的密钥。若要克服这个问题,可将上一个块中的信息混合到加密下一个块的过程中。这样,两个相同的明文块的输出就会不同。由于该技术使用上一个块加密下一个块,因此使用了一个 IV 来加密数据的第一个块。所以楼主直接使用上面的C的加密算法,是无法用C#的加密类直接替换的。
      

  18.   

    接楼上
    实际上楼主可以将C#中的DESCryptoServiceProvider对象的CipheMode属性设置为CipheMode.ECB,这样应该就是最基本的DES加密方法了,我没有具体实验,需要的人可以试一试啊。