使用 openssl 的AES 加密

源码:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <openssl/aes.h>

int main(int argc, char *argv[]){
    unsigned char buf[16] = "1234567890abcde";
    unsigned char buf2[16];
    unsigned char buf3[16];

    // 密钥为 0
    unsigned char aes_keybuf[32] = {0};

    AES_KEY aeskey;
    // 设置加密密钥
    AES_set_encrypt_key(aes_keybuf, 8 * sizeof(aes_keybuf), &aeskey);
    // 加密
    AES_encrypt(buf,buf2,&aeskey);

    printf("%s\n",buf2);

    //设置解密密钥
    AES_set_decrypt_key(aes_keybuf, 8 * sizeof(aes_keybuf), &aeskey);
    //解密
    AES_decrypt(buf2, buf3, &aeskey);

    printf("%s\n",buf3);
    return 0;
}

openssl API 说明

int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
    AES_KEY *key);

##设置加密密钥
## userKey 为用户定义密钥
## bits 密钥长度
## 生成的密钥(加密函数会用到)

int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
    AES_KEY *key);
##设置解密密钥
## userKey 为用户定义密钥
## bits 密钥长度
## 生成的密钥(解密函数会用到)

//加密函数
void AES_encrypt(const unsigned char *in, unsigned char *out,
    const AES_KEY *key);

//解密函数
void AES_decrypt(const unsigned char *in, unsigned char *out,
    const AES_KEY *key);

个人总结:

openssl API 大概使用步骤为

设置 加密密钥 –> 加密数据

设置 解密密钥 –> 解密数据

关于密钥,可以自定义;

另外需要注意的就是,加密解密的数据缓冲区必须要是16的倍数(openssl 内部实现的时候,会以16个char 为单位读取数据,同样,以上程序只会加密16个字节的数据…需要加密更长的字符串,把程序修改下即可)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 21:37:57

使用 openssl 的AES 加密的相关文章

JS和利用openssl的object C加密得到相同的aes加密密文

这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然后将该密文与post过来的密文进行对比,进行登录验证.也就是说,虽然进行了一次密码加密,但是在get/post的过程中,该密文是可见的,不符合客户的保密需求. 经过协商以后决定,在传递的过程中不再对密码进行传输,而是将账号与session进行组合,组合成一个新的字符串以后,将密码当做密钥,进行一次A

透过 Delphi 使用二进位金钥做 AES 加密.

从 1994 年开始,笔者就开始接触加密与网路安全的世界,从鲁立忠老师的指导当中获益良多,后来在台湾的元智大学就读研究所的时候,也以此为研究主题. 在当时,电子商务是显学,Visa跟 Master Card还特别为了网路交易制作了厚厚三大本的商务通讯协定,命名为SET (Secure Electronic Transaction,安全电子交易),从客户端.商店端.银行端定义了绵绵密密的交易规范. 然而,网际网路的世界跟 Visa Master Card所熟悉的专用网路世界差的远了,不是大狗们(B

JNI调用c++实现AES加密解密

最近项目中用到数据加密解密的功能,由于Android.iOS以及服务器端都需要用到这个功能.而不同平台上加密出来的密文是不一样的,这样导致互相之间密文无法使用.于是决定使用C/C++完成加密解密,其他平台调用的方式进行处理. 加密解密实现 AES加密的具体实现过程本文暂不讨论,实现代码是直接从openssl源码中抽出来. 加密解密调用以下两个方法: int aes_encrypt(char * in, char* key, char * out) 加密//明文,密钥,密文 int aes_dec

ruby AES加密解密

最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以就自己写了加密解密方法. AES 加密 def aes_encrypt(key, encrypted_string) aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB") aes.encrypt aes.key = key txt = aes.u

关于httpd 2.x,mod_auth_mysql模块的安装配置以及对aes加密的支持

前言 在之前的一篇博文<Apache httpd2.2版本以及2.4版本部分实验>的实验二里面,提到了协议认证使用了mod_auth_mysql.so模块,本文将阐述该模块的安装,配置,以及对于aes加密特性的支持. 基于开发者文档的安装步骤 注:在笔者的CentOS7测试环境下并不支持aes加密 首先从模块提供的官方站点下载mod_auth_mysql-3.0.0.tar.gz,并下载对应的补丁mod_auth_mysql_3.0.0_patch_apache2.4.diff,解压缩之后,将

polarssl rsa &amp; aes 加密与解密

上周折腾加密与解密,用了openssl, crypto++, polarssl, cyassl, 说起真的让人很沮丧,只有openssl & polarssl两个库的RSA & AES 加密和解密,我用起来了,crypto++各种模板,各种多继承,看的头大,而且对各种常用的加密算法也不了解,所以这个库我在折腾了一天之后就放弃了:cyassl这个库现在没什么印象了:openssl没什么好说的,用起来很方便,尤其是使用win32openssl,都不用自己编译,下载下来安装好了就能用,着实方便:

PHP如何使用AES加密和解密

AES加密在php5的版本中使用的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,取而代之的是openssl的openssl_encrypt和openssl_decrypt,并且代码也非常精简,下面是示例代码: 1 <?php 2 3 class Aes 4 { 5 public $key = ''; 6 public $iv = ''; 7 public $method = ''; 8 9 public function __construct($config) 10 {

Linux进行AES加密每次结果都不一致并且解密失败报错

1. 现象 windows操作系统下进行"123456"的AES加密 encrypted message is below : QLNYZyjRnKF/zxAjzDt/lw== decrypted message is below : 123456 阿里云服务器,同样是"123456"的密码,每次加密结果都不一样,且不是QLNYZyjRnKF/zxAjzDt/lw==,解密是报错的 2.解决方法 经过检查之后,定位在生成KEY的方法上,如下: public stat

AES加密

package util; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;impo