AES 加密解密API

linux下AES-CBC128的加密程序测试源码  

http://idsips.blog.163.com/blog/static/480012722012398048394/



AES加密和解密——使用openssl编程

http://www.lovelucy.info/openssl-aes-encryption.html


AES_cbc_encrypt

 

http://blog.sina.com.cn/s/blog_608a9fa70100dk6x.html


AES_cbc_encrypt and Perl Crypt::CBC Incompatibility

hex2bin bin2hex

http://www.opensubscriber.com/message/openssl-users@openssl.org/10974596.html


openssl  1.0.1

http://fossies.org/dox/openssl-1.0.1c/aes__misc_8c_source.html




AES  加密解密实例

http://blog.chinaunix.net/uid-26553782-id-3087173.html

 

#include<stdio.h>
#include <string.h>
#include "stdafx.h"
#include <openssl/aes.h>
#define INTERFACE"eth0" 
#define PAD_SIZE 32
/*
 *需要密钥key[16+1],向量iv1[16+1],明文pt1[]
*/
void hextoasii(unsignedchar *bytes,int byteNum,char *strAsii);
//----------------------------------------------------------
int aes_test(void)
{ 
    
    unsigned char key[]= ")*^&$*kdjfkdjfjdsjfska!*&^%$#@";// 128bits key (应该是真正的随机数才好)

    char pt1[]= "aaaaaaaaaaaaaaaaab";// 明文, 16位的时候 成功。

    pt1[5] = 0x0;
    
    char ct[1000]= {0};// 密文

    char pt2[1000]={0};// 解密后的明文

    AES_KEY k; 
    
    int ilen=sizeof(pt1);
    int ctLen =(ilen%16==0)?ilen:(ilen/16+1)*16;
    //|bc~!f947j*$m_op

    unsigned char iv1[16+1]= {"|bc~!f947j*$m_op"};// 16+1,加密用 

    unsigned char iv2[16+1]= {"|bc~!f947j*$m_op"};// 16+1,解密用

    
    
    int i,j;
    AES_set_encrypt_key(key, 16*16,&k);
 
 /*
 void AES_cbc_encrypt(
 const unsigned char *in, 
 unsigned char *out,
 const unsigned long length, //in 的长度
 const AES_KEY *key, //it will be changed during the encrypt&decrypt process, so it required to be reset each time
 unsigned char *ivec, //向量
 const int enc); 
 */
     AES_cbc_encrypt((unsignedchar*)pt1,(unsigned char*)ct, ilen,&k, (unsigned char*)iv1, AES_ENCRYPT);
 
     printf("encrypt:%s\n", ct);
     FILE *fp1= fopen("aes_encrypt.txt","w");
     fwrite(ct,sizeof(unsignedchar),ctLen, fp1);
     fflush(fp1);
 
 
     char strAsii[1000]={0};
     hextoasii((unsignedchar*)ct, ctLen, strAsii);
     printf("\n%s\n", strAsii);
 
 //memset(pt2, 0, 33);

 
     AES_set_decrypt_key(key, 16*16,&k);
     AES_cbc_encrypt((unsignedchar*)ct,(unsigned char*)pt2, ctLen,&k, (unsigned char*)iv2, AES_DECRYPT);
 
     printf("before: %s\n", pt1);
     printf("after : %s\n", pt2);
     if (memcmp(pt1, pt2, ilen)==0)
         puts("AES CBC mode ok");
     else puts("AES CBC mode err");
    
    return 0;
}
//-----------------------------------------------------------
char* AESDecrypt( 
      char* strEncryptDes,
      const char* strUnEncryptSrc
      )
{
     unsigned char cipher[10000]= {0};// 密文

     unsigned char iv1[16+1]= {"|bc~!f947j*$m_op"};// 16+1,向量 

     unsigned char strEncryptKey[]= ")*^&$*kdjfkdjfjdsjfska!*&^%$#@";// 128bits key (应该是真正的随机数才好)

     AES_KEY k;
     int ilen=strlen(strUnEncryptSrc);
     int ctLen = ilen/2;

     int i=0, nCipherHex=0;
     char strAsii[5];
     for(i=0; i<ctLen; i++)
     {
         memset(strAsii, 0, 5);
         memcpy(strAsii, strUnEncryptSrc, 2);
         sscanf(strAsii,"%X",&nCipherHex);
         cipher[i]= nCipherHex;
         strUnEncryptSrc += 2;
     }

     AES_set_decrypt_key(strEncryptKey, 16*16,&k);
     AES_cbc_encrypt((unsignedchar*)cipher,(unsigned char*)  strEncryptDes, ctLen,&k, (unsigned char*)iv1, AES_DECRYPT);
 //hextoasii(cipher, ctLen, strEncryptDes);

 return strEncryptDes;
}
//-----------------------------------------------------------
char* AESEncrypt( unsigned char* strUnEncryptSrc,unsigned char* strEncryptDes,int ilen)
{
     //string strEncryptDes;

      unsignedchar cipher[10000]= {0};// 密文

      unsignedchar iv1[16+1]= {"|bc~!f947j*$m_op"};// 16+1,向量 

      unsignedchar strEncryptKey[]= ")*^&$*kdjfkdjfjdsjfska!*&^%$#@";// 128bits key (应该是真正的随机数才好)

      AES_KEY k;
      int i=0;
      char strAsii[5];
 
      //int ilen=strUnEncryptSrc.length(); 

      int ctLen= (ilen%16==0)?ilen:(ilen/16+1)*16; 
 
      AES_set_encrypt_key((unsignedchar*)strEncryptKey, 16*16,&k);
 
 /*
 void AES_cbc_encrypt(
 const unsigned char *in, //明文
 unsigned char *out, //密文
 const unsigned long length, //in 的长度
 const AES_KEY *key, //it will be changed during the encrypt&decrypt process, so it required to be reset each time
 unsigned char *ivec, //向量
 const int enc); 
 */
      AES_cbc_encrypt(strUnEncryptSrc,(unsigned char*)cipher, ilen,&k, (unsigned char*)iv1, AES_ENCRYPT);
 
 
      for(i=0; i<ctLen; i++)
      {
            memset(strAsii, 0, 5);
            sprintf(strAsii,"%02X", cipher[i]);
            memcpy(&strEncryptDes[i*2], strAsii, 2);
      }     
      //hextoasii(cipher, ctLen, strEncryptDes);

      return(char*)strEncryptDes;
}
//-----------------------------------------------------------
void aes_hex(void)
{
      char str[]= "hello world\n";
      char strAes[10000]= {0};
      char strUnAes[10000]={0};
      AESEncrypt ((unsignedchar*)str,(unsigned char*)strAes,sizeof(str));
      AESDecrypt (strUnAes,strAes);
      printf("\n");
      printf(str);
      printf(strUnAes);
}
//----------------------------------------------------------
void hextoasii(unsignedchar *bytes,int byteNum,char *strAsii)
{
    int i=0;
    for(i=0; i<byteNum; i++)
    {
        sprintf(strAsii,"%02X", bytes[i]);
        strAsii += 2;
    }
    *strAsii ='\n';
}
 
AES_cbc_encrypt源码
http://bbs.chinaunix.net/thread-948004-1-1.html
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
                     const unsigned long length, const AES_KEY *key,
                     unsigned char *ivec, const int enc) {
        unsigned long n;
        unsigned long len = length;
        unsigned char tmp[AES_BLOCK_SIZE];
        const unsigned char *iv = ivec;
        assert(in && out && key && ivec);
        assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
        if (AES_ENCRYPT == enc) {
                while (len >= AES_BLOCK_SIZE) {
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
                                out[n] = in[n] ^ iv[n];
                        AES_encrypt(out, out, key);
                        iv = out;
                        len -= AES_BLOCK_SIZE;
                        in += AES_BLOCK_SIZE;
                        out += AES_BLOCK_SIZE;
                }
                if (len) {
                        for(n=0; n < len; ++n)
                                out[n] = in[n] ^ iv[n];
                        for(n=len; n < AES_BLOCK_SIZE; ++n)
                                out[n] = iv[n];
                        AES_encrypt(out, out, key);
                        iv = out;
                }
                memcpy(ivec,iv,AES_BLOCK_SIZE);
        } else if (in != out) {
                while (len >= AES_BLOCK_SIZE) {
                        AES_decrypt(in, out, key);
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
                                out[n] ^= iv[n];
                        iv = in;
                        len -= AES_BLOCK_SIZE;
                        in  += AES_BLOCK_SIZE;
                        out += AES_BLOCK_SIZE;
                }
                if (len) {
                        AES_decrypt(in,tmp,key);
                        for(n=0; n < len; ++n)
                                out[n] = tmp[n] ^ iv[n];
                        iv = in;
                }
                memcpy(ivec,iv,AES_BLOCK_SIZE);
        } else {
                while (len >= AES_BLOCK_SIZE) {
                        memcpy(tmp, in, AES_BLOCK_SIZE);
                        AES_decrypt(in, out, key);
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
                                out[n] ^= ivec[n];
                        memcpy(ivec, tmp, AES_BLOCK_SIZE);
                        len -= AES_BLOCK_SIZE;
                        in += AES_BLOCK_SIZE;
                        out += AES_BLOCK_SIZE;
                }
                if (len) {
                        memcpy(tmp, in, AES_BLOCK_SIZE);
                        AES_decrypt(tmp, out, key);
                        for(n=0; n < len; ++n)
                                out[n] ^= ivec[n];
                        for(n=len; n < AES_BLOCK_SIZE; ++n)
                                out[n] = tmp[n];
                        memcpy(ivec, tmp, AES_BLOCK_SIZE);
                }
        }
}
 




(*****************************************************)(* *)(* Advanced Encryption Standard (AES) *)(* Interface Unit v1.3 *)(* *)(* Readme.txt 自述文档 2004.12.04 *)(* *)(*****************************************************)(* 介绍 *)AES 是一种使用安全码进行信息加密的标准。它支持 128 位、192 位和 256 位的密匙。加密算法的实现在 ElAES.pas 单元中。本人将其加密方法封装在 AES.pas 单元中,只需要调用两个标准函数就可以完成字符串的加密和解密。(* 密匙长度 *)128 位支持长度为 16 个字符192 位支持长度为 24 个字符256 位支持长度为 32 个字符所有加密和解密操作在默认情况下为 128 位密匙。(* 文件列表 *)..Source AES 单元文件..Example 演示程序(* 适用平台 *)这份 Delphi 的执行基于 FIPS 草案标准,并且 AES 原作者已经通过了以下平台的测试: Delphi 4 Delphi 5 C++ Builder 5 Kylix 1本人又重新进行了补充测试,并顺利通过了以下平台: Delphi 6 Delphi 7特别说明: 在 Delphi 3 标准版中进行测试时,因为缺少 Longword 数据类型和 Math.pas 文件,并且不支持 overload 指示字,所以不能正常编译。(* 演示程序 *)这个示例程序演示了如何使用 AES 模块进行字符串的加密和解密过程。(* 使用方法 *)在程序中引用 AES 单元。调用函数 EncryptString 和 DecryptString 进行字符串的加密和解密。调用函数 EncryptStream 和 DecryptStream 进行流的加密和解密。调用过程 EncryptFile 和 DecryptFile 进行文件的加密和解密。详细参阅 Example 文件夹中的例子。(* 许可协议 *)您可以随意拷贝、使用和发部这个程序,但是必须保证程序的完整性,包括作者信息、版权信息和说明文档。请勿修改作者和版权信息。 这个程序基于 Mozilla Public License Version 1.1 许可,如果您使用了这个程序,那么就意味着您同意了许可协议中的所有内容。您可以在以下站点获取一个许可协议的副本。 http://www.mozilla.org/MPL/许可协议的发布基于 "AS IS" 基础,详细请阅读该许可协议。Alexander Ionov 是 AES 算法的最初作者,保留所有权利。(* 作者信息 *)ElAES 作者:EldoS, Alexander IonovAES Interface Unit 作者:杨泽晖 (Jorlen Young)您可以通过以下方式与我取得联系。WebSite: http://jorlen.51.net/ http://mycampus.03.com.cn/ http://mycampus.1155.net/ http://mycampus.ecoo.net/ http://mycampus.5500.org/Email: stanley_xfx@163.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值