openssl AES-cbc 加密 通过C++实现

最近工作需要使用到加密,对于程序内的数据就采用了对称加密,于是就使用了AES加密。废话不多说了,直接上代码

bob_aes.h

#ifndef bob_aes_h
#define bob_aes_h

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <cstdlib>
#include <openssl/aes.h>

class BobAES
{
public:
	BobAES();
	~BobAES();
	std::string aes_encrypt(std::string msg);
	std::string aes_decrypt(std::string msg);
private:
	int MSG_LEN;
	char key[AES_BLOCK_SIZE];
};

#endif

bob_aes.cpp

#include "bob_aes.h"

BobAES::BobAES()
	: MSG_LEN(0)
{
	for(int i = 0; i < AES_BLOCK_SIZE; i++)
	{
		key[i] = 32 + i;
	}
}

BobAES::~BobAES()
{

}

std::string BobAES::aes_encrypt(std::string msg)
{
	int i = msg.size() / 1024;
	MSG_LEN = ( i + 1 ) * 1024;

	//MSG_LEN = msg.size() + 16;

	char in[MSG_LEN];
	char out[MSG_LEN+16];
	memset((char*)in,0,MSG_LEN);
	memset((char*)out,0,MSG_LEN+16);

	strncpy((char*)in,msg.c_str(),msg.size());

	unsigned char iv[AES_BLOCK_SIZE]; //加密的初始化向量
	for(int j = 0; j < AES_BLOCK_SIZE; ++j)
	{
		iv[j] = 0;
	}

	AES_KEY aes;
	if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
	{
		return NULL;
	}
	int len = msg.size();

	AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_ENCRYPT);

	std::string encrypt_msg(&out[0],&out[MSG_LEN+16]);
	for(int i= 0;out[i];i++){
        printf("%x",(unsigned char)out[i]);
        //std::cout << dstStringTemp[i];
    }
	std::cout << std::endl;
	return encrypt_msg;
}

std::string BobAES::aes_decrypt(std::string msg)
{
	MSG_LEN = msg.size();

	char in[MSG_LEN];
	char out[MSG_LEN+16];
	memset((char*)in,0,MSG_LEN);
	memset((char*)out,0,MSG_LEN+16);

	strncpy((char*)in,msg.c_str(),msg.size());

	for(int i= 0;in[i];i++){
        printf("%x",(unsigned char)in[i]);
        //std::cout << dstStringTemp[i];
    }
	std::cout << std::endl;

	unsigned char iv[AES_BLOCK_SIZE]; //加密的初始化向量
	for(int j = 0; j < AES_BLOCK_SIZE; ++j)
	{
		iv[j] = 0;
	}

	AES_KEY aes;
	if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
	{
		return NULL;
	}
	int len = msg.size();
	AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_DECRYPT);
	std::string decrypt_msg = out;
	return decrypt_msg;
}

这个代码还存在一些问题,对于字节在96以内的字符串可以加密解密成功,但96及以上字节的字符串加密解密后就会出现乱码,对这方面我还是新手,请大神们多多指正。

时间: 2024-10-13 18:50:05

openssl AES-cbc 加密 通过C++实现的相关文章

JAVA AES CBC 加密 解密

AES 256 , KEY 的长度为 32字节(32*8=256bit). AES 128 , KEY 的长度为 16字节(16*8=128bit) CBC 模式需要IV, IV的值是固定写死,还是当参数传入,自己看情况.IV的长度没研究,这里用的是16字符. java PKCS5Padding 对应 C#.NET 的 PKCS7 . 明文,KEY和IV 三者 string 转 byte[] 时要统一编码,如UTF-8. 加密后 cipher.doFinal() 得到密文byte[] ,是直接转

openssl AES加密以及padding

好习惯,先上代码再说事 加密 void AesEncrypt(unsigned char* pchIn, int nInLen, unsigned char *ciphertext, int &ciphertext_len, unsigned char * pchKey) { EVP_CIPHER_CTX en; EVP_CIPHER_CTX_init(&en); const EVP_CIPHER *cipher_type; unsigned char *passkey, *passiv,

java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里面支持PKCS7Padding填充. 説辣么多不如上代码: public class AESUtil { /** * Encodes a String in AES-256 with a given key * * @param context * @param password * @param

AES/CBC/PKCS5Padding对称加密

1 package unit; 2 import javax.crypto.Cipher; 3 import javax.crypto.spec.IvParameterSpec; 4 import javax.crypto.spec.SecretKeySpec; 5 6 import org.apache.commons.codec.binary.Base64; 7 /** 8 * AES/CBC/PKCS5Padding 对称加密 9 * @author jia 10 * 11 */ 12 p

linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: 1 <dependency> 2 <groupId>org.bouncycastle</groupId> 3 <artifactId>bcprov-jdk15on</artifactId> 4 <version>1.56</version> 5 </dep

python AES CBC模式加密

今天需要用到AES CBC模式加密,搜索了很久,终于加密成功,记录一下今天的理解. 首先要安装pycrypto库,不知道为什么在windows安装失败,在linux可以正常安装 http://tool.chacuo.net/cryptaes,https://tools.lami.la/jiami/aes,以下代码加密后结果与这两个网页加密后一样. 这里有几点要注意,key的长度要是16,24或32,text的长度要是16的倍数,不满足长度都会补全,补全的字符可以自己定义,比如key补全不一定要"

AES加密解密 助手类 CBC加密模式

string str = "2018"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); namespace Demo { /// <summary> /// AES加密解密 助手类 /// CBC加密模式 /// </summary> public class AESHelper { /// <summary> /

php AES cbc模式 pkcs7 128位加密解密(微信小程序)

PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '123456'; $blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $len = strlen($message); //取得字符串长度 $pad = $blocksize - ($len % $blocksiz

C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式

============================================== des   cbc  加密 zeropadding填充方式 ============================================== //加密 cbc zeropadding 自己实现 std::string des_cbc_zero_encrypt(const std::string &clearText, const std::string &key) { static u

AES/CBC/PKCS7Padding加密方式

在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 final static String algorithmStr = "AES/CBC/PKCS7Padding"; // private static Key key; private static Cipher cipher; boo