http://www.c-sharpcorner.com/Code/2002/Dec/CryptEncryption.asp

解决方案 »

  1.   

    用DES三次,具体的:
    假设DES加密的方法是_HandleData(int[] data, int startindex, bool isencrypt);
    isencrypt表明是加密还是解密,true为加密;data是要加密的数据;
    那么加密过程是:
    _HandleData(data1, 0, true);
    _HandleData(data1, 32, false);
    _HandleData(data1, 64, true);解密过程是:
    _HandleData(data1, 0, false);
    _HandleData(data1, 32, true);
    _HandleData(data1, 64, false);
    注意,DES关键字长度是64位,3DES可能是128或者192位。如果是128位,将前64位追加到最后。
    在计算时,关键字是经过处理的,64位最终的关键字是长度为32的整型数组。
      

  2.   

    那DES的算法代码怎么写呢,我在网上找了几个,但是运行老是报错,可不可以麻烦你告诉我一下
      

  3.   

    简单的:
    处理函数:
    private void _HandleData(int[] data1, int keyindex, boolean isenc) {
    IPERM(data1);
    if (isenc) {
    FL(data1, 0 + keyindex);
    FR(data1, 2 + keyindex);
    FL(data1, 4 + keyindex);
    FR(data1, 6 + keyindex);
    FL(data1, 8 + keyindex);
    FR(data1, 10 + keyindex);
    FL(data1, 12 + keyindex);
    FR(data1, 14 + keyindex);
    FL(data1, 16 + keyindex);
    FR(data1, 18 + keyindex);
    FL(data1, 20 + keyindex);
    FR(data1, 22 + keyindex);
    FL(data1, 24 + keyindex);
    FR(data1, 26 + keyindex);
    FL(data1, 28 + keyindex);
    FR(data1, 30 + keyindex);
    } else {
    FL(data1, 30 + keyindex);
    FR(data1, 28 + keyindex);
    FL(data1, 26 + keyindex);
    FR(data1, 24 + keyindex);
    FL(data1, 22 + keyindex);
    FR(data1, 20 + keyindex);
    FL(data1, 18 + keyindex);
    FR(data1, 16 + keyindex);
    FL(data1, 14 + keyindex);
    FR(data1, 12 + keyindex);
    FL(data1, 10 + keyindex);
    FR(data1, 8 + keyindex);
    FL(data1, 6 + keyindex);
    FR(data1, 4 + keyindex);
    FL(data1, 2 + keyindex);
    FR(data1, 0 + keyindex);
    }
    FPERM(data1);
    int tt = data1[0];
    data1[0] = data1[1];
    data1[1] = tt;
    }private static void IPERM(int[] data) {
    int work;
    int left = data[0], right = data[1];
    right = rotl(right, 4);
    work = (left ^ right) & 0xf0f0f0f0;
    left ^= work;
    right = rotr(right ^ work, 20);
    work = (left ^ right) & 0xffff0000;
    left ^= work;
    right = rotr(right ^ work, 18);
    work = (left ^ right) & 0x33333333;
    left ^= work;
    right = rotr(right ^ work, 6);
    work = (left ^ right) & 0x00ff00ff;
    left ^= work;
    right = rotl(right ^ work, 9);
    work = (left ^ right) & 0xaaaaaaaa;
    left = rotl(left^work, 1);
    right ^= work;
    data[0] = left;
    data[1] = right;
    }private static void FPERM(int[] data) {
    int work;
    int left = data[0], right = data[1];
    right = rotr(right, 1);
    work = (left ^ right) & 0xaaaaaaaa;
    right ^= work;
    left = rotr(left ^ work, 9);
    work = (left ^ right) & 0x00ff00ff;
    right ^= work;
    left = rotl(left ^ work, 6);
    work = (left ^ right) & 0x33333333;
    right ^= work;
    left = rotl(left ^ work, 18);
    work = (left ^ right) & 0xffff0000;
    right ^= work;
    left = rotl(left ^ work, 20);
    work = (left ^ right) & 0xf0f0f0f0;
    right ^= work;
    left = rotr(left ^ work, 4);
    data[0] = left;
    data[1] = right;
    }private void FL(int[] data, int index) {
    int l = data[0];
    int r = data[1];
    int work = rotr(r, 4) ^ this.Key[index];
    l ^= Spbox[6][work & 0x3f]
      ^  Spbox[4][(work >> 8) & 0x3f]
      ^  Spbox[2][(work >> 16) & 0x3f]
      ^  Spbox[0][(work >> 24) & 0x3f];
    work = r ^ this.Key[index + 1];
    l ^= Spbox[7][work & 0x3f]
      ^  Spbox[5][(work >> 8) & 0x3f]
      ^  Spbox[3][(work >> 16) & 0x3f]
      ^  Spbox[1][(work >> 24) & 0x3f];
    data[0] = l;
    }private void FR(int[] data, int index) {
    int l = data[1];
    int r = data[0];
    int work = rotr(r, 4) ^ this.Key[index];
    l ^= Spbox[6][work & 0x3f]
      ^  Spbox[4][(work >> 8) & 0x3f]
      ^  Spbox[2][(work >> 16) & 0x3f]
      ^  Spbox[0][(work >> 24) & 0x3f];
    work = r ^ this.Key[index + 1];
    l ^= Spbox[7][work & 0x3f]
      ^  Spbox[5][(work >> 8) & 0x3f]
      ^  Spbox[3][(work >> 16) & 0x3f]
      ^  Spbox[1][(work >> 24) & 0x3f];
    data[1] = l;
    }private static int rotr(int x, int n) {
    return (x >>> n) | (x << (32 - n));
    }private static int rotl(int x, int n) {
    return (x << n) | (x >>> (32 - n));
    }
      

  4.   

    老兄不看MSDN的吗?private static void EncryptData(String inName, String outName, byte[] tdesKey, byte[] tdesIV)
    {    
        //Create the file streams to handle the input and output files.
        FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
        FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
        fout.SetLength(0);
          
        //Create variables to help with read and write.
        byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
        long rdlen = 0;              //This is the total number of bytes written.
        long totlen = fin.Length;    //This is the total length of the input file.
        int len;                     //This is the number of bytes to be written at a time.    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();          
        CryptoStream encStream = new CryptoStream(fout, tdes.CreateEncryptor(tdesKey, tdesIV), CryptoStreamMode.Write);
                   
        Console.WriteLine("Encrypting...");    //Read from the input file, then encrypt and write to the output file.
        while(rdlen < totlen)
        {
            len = fin.Read(bin, 0, 100);
            encStream.Write(bin, 0, len);
            rdlen = rdlen + len;
            Console.WriteLine("{0} bytes processed", rdlen);
        }    encStream.Close();                     
    }
      

  5.   

    看啊,但这个是文件输入输出的,
    而且我搞不清楚她的tdesIV有什么用。
      

  6.   

    把filestream换成memerystream就可以了,当然需要少许改动.
      

  7.   

    IV是初始化向量,MSDN里有解释,你就把它当做密钥好了.
      

  8.   

    des的算法我写好了,但是3des怎么写啊,des我就是一个函数encrypt(data),怎么转换成3des,
      

  9.   

    3des 可以参见 System.Security.Cryptography.TripleDES
      

  10.   

    http://www.zpcity.com/arli/commonprj/cls_DesEncrypt.cs