在项目中需要对一些关键信息进行传输,但又不能是明文,所以采用此种方式进行加密,另一端再进行解密。

AES: 算法

CBC: 模式

​ 使用CBC模式,需要一个向量iv,可增加加密算法的强度

PKCS5: 补码方式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/aes.h> int base64_encode(char *in_str, int in_len, char *out_str)
{
BIO *b64, *bio;
BUF_MEM *bptr = NULL;
size_t size = 0; if (in_str == NULL || out_str == NULL)
return -1; b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio); BIO_write(bio, in_str, in_len);
BIO_flush(bio); BIO_get_mem_ptr(bio, &bptr);
memcpy(out_str, bptr->data, bptr->length-1);
out_str[bptr->length-1] = '\0';
size = bptr->length-1; BIO_free_all(bio);
return size;
} void aes_cbc_pcsk5_encrypt(char* pcInput, int nLen, char* pcOut)
{
char key[17] = "abcdefghijklmno";
char iv[17] = "1122334455667788";
char encrypt_string[1024] = { 0 };
AES_KEY aes;
int n = 0; int nBei = nLen / AES_BLOCK_SIZE + 1;
int nTotal = nBei * AES_BLOCK_SIZE;
char *enc_s = (char*)malloc(nTotal);
int nNumber = 0;
printf("nBei=%d, nTotal=%d,nLen=%d\n",nBei, nTotal, nLen); //KCS5Padding:填充的原则是,如果长度少于16个字节,需要补满16个字节,补(16-len)个(16-len)例如:
//"31325980"这个节符串是8个字节,16-8=8,补满后如:31325980+8个十进制的8
//如果字符串长度正好是16字节,则需要再补16个字节的十进制的16。
if (nLen % 16 > 0)
{
nNumber = nTotal - nLen;
printf("number=%d\n", nNumber);
}
else
{
nNumber = 16;
} memset(enc_s, nNumber, nTotal);
memcpy(enc_s, pcInput, nLen);
printf("enc_s=%s\n", enc_s); //设置加密密钥,16字节
if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
fprintf(stderr, "Unable to set encryption key in AES\n");
exit(-1);
} AES_cbc_encrypt((unsigned char *)enc_s, (unsigned char*)encrypt_string, nTotal, &aes, (unsigned char*)iv, AES_ENCRYPT);
n = strlen(encrypt_string);
printf("encrypt_string n:%d, %ld\n", n, sizeof(encrypt_string)); base64_encode(encrypt_string, nTotal, pcOut);
n = strlen(pcOut);
printf("n:%d\n", n); free(enc_s);
} int main(int argc, char** argv)
{
char* input_string = "31325980";
char* input_string2 = "PZ884A16BB0020LA";
int nLen = strlen(input_string);
int nLen2 = strlen(input_string2);
char str2[1024] = { 0 };
char str3[1024] = { 0 }; printf("AES_BLOCK_SIZE=%d\n", AES_BLOCK_SIZE);
aes_cbc_pcsk5_encrypt(input_string, nLen, str2);
printf("%s\n", str2);
aes_cbc_pcsk5_encrypt(input_string2, nLen2, str3);
printf("%s\n", str3); return 0;
}

void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key,unsigned char *ivec, const int enc);

in: 表示加密前的明文;

out: 表示加密后的密文;

length: 明文的长度;

key: 加\解密密钥;

ivec:可读写的一块内存,一般长度为16字节;

​ AES_cbc_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

enc: AES_ENCRYPT表示加密,AES_DECRYPT表示解密;

AES_CBC_PKCS5Padding 加密的更多相关文章

  1. aes 128、192、256位,cbc、cfb、ecb、ofb、pcbc加密解密

    AES加解密总共有以下这些 算法/模式/填充 字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES ...

  2. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  3. “不给力啊,老湿!”:RSA加密与破解

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...

  4. .NET 对接JAVA 使用Modulus,Exponent RSA 加密

    最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...

  5. AES加密

    package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...

  6. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  7. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...

  8. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  9. GPG终极指南(加密/签名)

    我们平时都听过非对称加密,公钥和私钥,签名验证,但这些证书都是怎么得到的呢?本篇文章会解答这些问题. 背景介绍 加密的一个简单但又实用的任务就是发送加密电子邮件.多年来,为电子邮件进行加密的标准一直是 ...

随机推荐

  1. select标签中option内容加链接

    1.Html页面代码 <select name="select" id="select" style="height: 25px; width: ...

  2. Android-Universal-Image-Loader载入图片

    直接看代码:MainActivity: package com.example.textwsjdemo; import com.nostra13.universalimageloader.cache. ...

  3. FXC Define的使用方法

    https://docs.microsoft.com/en-us/windows/desktop/direct3dtools/dx-graphics-tools-fxc-syntax https:// ...

  4. vue-resource文档详细解读

    Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新.Vue通过插件的形式实现了基于AJAX,JSPNP等技术的服务端通信. vue-resource是一个通 ...

  5. php fopen函数返回false

    使用yum安装的apache2.4.6   php 7.2.2  正确安装后使用fopen()函数打开文件时返回false 百度一下又三种原因 1.目录或者文件夹权限原因 (可以用   chmod - ...

  6. (转)scala apply方法 笔记

    在akka源码中有这样一个Cluster类. 使用方法是这样的:val cluster = Cluster(context.system); 作为scala菜鸟的我,并没有找到Cluster(syst ...

  7. 一个tomcat中部署多个项目

    在各自的项目web.xml中添加 <context-param> <param-name>webAppRootKey</param-name> <param- ...

  8. 使用ant运行testng的testng.xml并且使用testng-results.xsl美化结果

    先看build.xml <?xml version="1.0" encoding="UTF-8"?> <project basedir=&qu ...

  9. iPhone销售拉动 鸿海精密第一季度利润增长21%

    据美国<华尔街日报>5月15日消息,苹果公司主要代工厂鸿海精密发布,第一季度利润增长21%.主要得益于iPhone手机销量强劲以及生产效率提升. 这家全球最大的电子产品代工商近一半的收入是 ...

  10. Hibernate开发环境搭建

    一.下载Hibernate包的下载 官网地址:http://hibernate.org/orm/ 下载版本:hibernate-release-4.3.11.Final 二.Hibernate jar ...