zoukankan      html  css  js  c++  java
  • OpenSSL加解密

    http://www.caole.net/diary/des.html

    OpenSSL - DES

     

    Summary

    This library contains a fast implementation of the DES encryption algorithm.

    There are two phases to the use of DES encryption.

    • The first is the generation of a DESkeyschedule from a key,
    • The second is the actual encryption. A DES key is of type DEScblock. This type is consists of 8 bytes with odd parity. The least significant bit in each byte is the parity bit. The key schedule is an expanded form of the key; it is used to speed the encryption process.

    DES使用的例子

    /**//*
    gcc -o des-basic des-basic.c -lcrypto
    */
    
    #include <stdio.h>
    #include <openssl/des.h>
    
    int main(int argc,char **argv)
    {
        DES_cblock key;
        /**//* DES_random_key(&key); */ /**//* generate a random key */
        DES_string_to_key("pass", &key);
    
        DES_key_schedule schedule;
        DES_set_key_checked(&key, &schedule); 
    
        const_DES_cblock input = "hehehe";
        DES_cblock output;
    
        printf("cleartext:%s ", input);
    
        DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);
        printf("Encrypted! ");
    
        printf("ciphertext:");
        int i;
        for (i = 0; i < sizeof(input); i++)
             printf("%02x", output[i]);
        printf(" ");
    
        DES_ecb_encrypt(&output, &input, &schedule, DES_DECRYPT);
        printf("Decrypted! ");
        printf("cleartext:%s ", input);
    
        return 0;
    } 
    

    另一个带注释的例子

    // DES encrypt with OpenSSL support
    // g++ crypt.cc -lssl -o crypt
    
    #include <openssl/des.h>;
    #include <iostream>;
    
    int main(int argc, char** argv)
    {
       try
       {
          std::string keystring("this is my key");// 初始化key(密钥)
          DES_cblock key[1];   //具体是什么?不知道也一样可以用
          DES_key_schedule key_schedule;   //字面意思是密码表
    
          if (NULL != argv[1])
             keystring.assign(argv[1]);//如果命令行指定了key,那么就用指定的
    
          // 生成一个 key
          DES_string_to_key(keystring.c_str(), key);
          if (DES_set_key_checked(key, &key_schedule) != 0)
             throw "DES_set_key_schedule";
    
          unsigned char input[] = "this is a text being encrypted by openssl";//需要加密的字符串
          size_t len = (sizeof(input)+7)/8 * 8;  
          unsigned char *output = new unsigned char[len+1];
           //加密以后的内容怎么分配内存,照上面这两步走就是了
           //错了就干掉贴代码的人:mrgreen:
          DES_cblock ivec;  
           //照这个搞就是了,用别人的代码不一定要知道所由的细节是为什么
    
          // 加密
          memset((char*)&ivec, 0, sizeof(ivec));//ivec清0
          DES_ncbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, 1);//这里就进行加密了
          std::cout << input << std::endl;
    
          //输出加密以后的内容
          for (int i = 0; i < len; ++i)
             printf("%02x", output[i]);
          std::cout << std::endl;
    
          // 解密
          memset((char*)&ivec, 0, sizeof(ivec));
          DES_ncbc_encrypt(output, input, len, &key_schedule, &ivec, 0);
          std::cout << input << std::endl;
    
          delete[] output;
       }
       catch(const char* errstr)   //对抛出异常的处理
       {
          std::cerr << errstr << std::endl;
          return EXIT_FAILURE;
       }
    
       return EXIT_SUCCESS;
    

    另一段Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <openssl/des.h>
    
    #define LEN_OF_KEY 24
    
    int main(void)
    {
        char tmp_str[512];
        int tmp_len;
    
        int docontinue = 1;
        unsigned char *data = "530160";
        int data_len;
        int data_rest;
        unsigned char ch;
    
        unsigned char *src = NULL;
        unsigned char *dst = NULL;
        int len;
        unsigned char tmp[8];
        unsigned char in[8];
        unsigned char out[8];
    
        char *k = "12345678901234567890";
        int key_len;
        unsigned char key[LEN_OF_KEY];
        unsigned char block_key[9];
        DES_key_schedule ks,ks2,ks3;
    
        key_len = strlen(k);
        memcpy(key, k, key_len);
        memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
    
        data_len = strlen(data);
        data_rest = data_len % 8;
        len = data_len + (8 - data_rest);
        ch = 8 - data_rest;
    
        src = malloc(len);
        dst = malloc(len);
        if (NULL == src || NULL == dst)
        {
            docontinue = 0;
        }
        if (docontinue)
        {
            int count;
            int i, j;
    
            memset(src, 0, len);
            memcpy(src, data, data_len);
            memset(src + data_len, ch, 8 - data_rest);
    
            memset(block_key, 0, sizeof(block_key));
            memcpy(block_key, key + 0, 8);
            DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
            memcpy(block_key, key + 8, 8);
            DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
            memcpy(block_key, key + 16, 8);
            DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);
    
            printf("before encrypt:");
            for (i = 0; i < len; i++)
            {
                printf("0x%.2X ", *(src + i));
            }
            printf("
    ");
    
            count = len / 8;
            for (i = 0; i < count; i++)
            {
                memset(tmp, 0, 8);
                memset(in, 0, 8);
                memset(out, 0, 8);
                memcpy(tmp, src + 8 * i, 8);
    
                DES_ecb3_encrypt((const_DES_cblock*)&tmp, (DES_cblock*)&in, &ks, &ks2, &ks3, DES_ENCRYPT);
    
                for(j = 0; j < sizeof(in); j++){
                    printf("%02x", in[j]);
                }
                printf("
    ");
    
                DES_ecb3_encrypt((const_DES_cblock*)&in, (DES_cblock*)&out, &ks, &ks2, &ks3, DES_DECRYPT);
    
    
                memcpy(dst + 8 * i, out, 8);
            }
    
            printf("after decrypt :");
            for (i = 0; i < len; i++)
            {
                printf("0x%.2X ", *(dst + i));
            }
    
            printf("[%s]
    ", dst);
        }
    
        if (NULL != src)
        {
            free(src);
            src = NULL;
        }
        if (NULL != dst)
        {
            free(dst);
            dst = NULL;
        }
    
        return 0;
    }
    

    Author: Le Cao

    Date: 2010-10-12 18:19:41 CST

    HTML generated by org-mode TAG=7.01g in emacs 23

  • 相关阅读:
    stm32入门
    Shell入门
    广播与组播
    超时接收
    socket的四种IO模型
    网络套接字socket
    网络基础
    慢速系统调用被中断
    C# 程序运行时间计算
    HTTP的传输编码(Transfer-Encoding:chunked) / net::ERR_INVALID_CHUNKED_ENCODING
  • 原文地址:https://www.cnblogs.com/androidme/p/3254933.html
Copyright © 2011-2022 走看看