使用Crypto++库的CBC模式实现加密(二)
前面已经有一篇介绍使用Crypto++库实现的加密的文章了,但是代码中考虑的不完全,所以就重新发了个二
C++封装:
- #include "zyaes.h"
- #include <string.h>
- #include <stdio.h>
- using namespace CryptoPP;
- CZYAes::CZYAes()
- {
- byte byteKey[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x01,0x02, 0x03,0x04,0x05,0x06,0x07,0x08,
- 0x01,0x02, 0x03,0x04,0x05,0x06,0x07,0x08, 0x01,0x02, 0x03,0x04,0x05,0x06,0x07,0x08};
- byte byteIv[] = {0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04, 0x01,0x02, 0x03,0x04,0x01,0x02,0x03,0x04};
- memcpy(m_arrByteKey, byteKey, sizeof(byte) * );
- memcpy(m_arrByteIv, byteIv, sizeof(byte) * );
- m_nKeyLen = ;
- }
- CZYAes::~CZYAes()
- {
- }
- // set key and iv
- void CZYAes::SetKey(std::string strKey, std::string strIv)
- {
- int nKeyLen = ;
- int nIvLen = ;
- memset(m_arrByteKey, , sizeof(byte) * );
- memset(m_arrByteIv, , sizeof(byte) * );
- if (strKey.length() >= )
- {
- nKeyLen = ;
- }
- else
- {
- nKeyLen = strKey.length();
- }
- memcpy(m_arrByteKey, strKey.c_str(), sizeof(byte) * nKeyLen);
- if (!strIv.empty())
- {
- if (strIv.length() >= )
- {
- nIvLen = ;
- }
- else
- {
- nIvLen = strIv.length();
- }
- memcpy(m_arrByteIv, strIv.c_str(), sizeof(byte) * nIvLen);
- }
- }
- // encrypt
- std::string CZYAes::Encrypt(const std::string &strText)
- {
- std::string strCipher;
- CBC_Mode<AES>::Encryption aesEncryptor(m_arrByteKey, m_nKeyLen, m_arrByteIv);
- StringSource(strText, true, new StreamTransformationFilter(aesEncryptor, new StringSink(strCipher)));
- std::string strEncoded;
- StringSource s2(strCipher, true,
- new HexEncoder(
- new StringSink(strEncoded)
- ) // HexEncoder
- ); // StringSource
- return strEncoded;
- }
- // decrypt
- std::string CZYAes::Decrypt(const std::string &strCipher)
- {
- std::string strDecoded;
- StringSource s2(strCipher, true,
- new HexDecoder(
- new StringSink(strDecoded)
- ) // HexEncoder
- ); // StringSource
- std::string strText;
- CBC_Mode<AES>::Decryption aesEncryptor(m_arrByteKey, m_nKeyLen, m_arrByteIv);
- StringSource(strDecoded, true, new StreamTransformationFilter(aesEncryptor, new StringSink(strText)));
- return strText;
- }
实现文件
头文件
C封装:
- //*****************************************************************************
- //@FileName : aes256.cpp
- //@Version : v1.0.0
- //@Author : xiaoc
- //@Date : 2015/03/13
- //*****************************************************************************
- #include "zyaes.h"
- #include "zyaes256.h"
- using namespace std;
- string Encrypt(const string &strText, const string &strKey/* = "" */)
- {
- std::string strCipher;
- int nLen = ;
- CZYAes aes;
- if (!strKey.empty())
- {
- aes.SetKey(strKey, "");
- }
- strCipher = aes.Encrypt(strText);
- return strCipher;
- }
- string Decrypt(const string &strCipher, const string &strKey/* = "" */)
- {
- std::string strText;
- int nLen = ;
- CZYAes aes;
- if (!strKey.empty())
- {
- aes.SetKey(strKey, "");
- }
- strText = aes.Decrypt(strCipher);
- return strText;
- }
实现文件
- //*****************************************************************************
- //@FileName : zyaes256.h : the c interface of class zyaes
- //@Version : v1.0.0
- //@Author : xiaoc
- //@Date : 2015/03/13
- //*****************************************************************************
- #ifndef _ZYAES256_H_
- #define _ZYAES256_H_
- #include <string>
- //*****************************************************************************
- //@strText : 需要加密的数据
- //@strKey : 加密用的密钥
- //@return : 返回加密之后的数据
- //*****************************************************************************
- std::string Encrypt(const std::string &strText, const std::string &strKey = "");
- //*****************************************************************************
- //@strText : 需要解密的数据
- //@strKey : 解密用的密钥
- //@return : 返回解密之后的数据
- //*****************************************************************************
- std::string Decrypt(const std::string &strCipher, const std::string &strKey = "");
- #endif // _ZYAES256_H_
头文件
此次修改主要是上一个版本中没有考虑到加密数据在网络中的传输问题,因为加密数据不再是简单的ASCII字符,所以不能存在char数组中,上一版本中就因为这个问题导致了数据的丢失,因为加密数据中的0导致字符串被截断了。
因此现在的做法是,先对加密数据进行转换,转换为16进制。然后传输,解密端做相反处理即可。
其中有个疑问是,cryptopp加密库将加密数据存在string中,但是string为什么能够存储非ASCII字符呢?
使用Crypto++库的CBC模式实现加密(二)的更多相关文章
- 使用Crypto++库的CBC模式实现加密
//***************************************************************************** //@File Name : scsae ...
- C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项
DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...
- Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda
1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...
- 使用Crypto++库编译出错 解决办法
错误信息: >------ 已启动生成: 项目: testCrypto++, 配置: Debug Win32 ------ >正在编译... >main.cpp >正在链接.. ...
- 解决AES算法CBC模式加密字符串后再解密出现乱码问题
问题 在使用 AES CBC 模式加密字符串后,再进行解密,解密得到的字符串出现乱码情况,通常都是前几十个字节乱码: 复现 因为是使用部门 cgi AESEncryptUtil 库,找到问题后,在这里 ...
- C#调用Crypto++库AES ECB CBC加解密
本文章使用上一篇<C#调用C++类库例子>的项目代码作为Demo.本文中,C#将调用C++的Crypto++库,实现AES的ECB和CBC加解密. 一.下载Crypto 1.进入Crypt ...
随机推荐
- C# SMTP邮件发送程序
邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...
- 关于substring的char[]共享
我们知道,对于一个较大的String对象假设从中获取一个子串.jdk默认子串的char[]是共享原串的char[].即子串的char[]是原串的char[]中的一部分, 这样对于一个原串多个子串的情况 ...
- 修复错误配置/etc/fstab文件导致系统无法正常启动
1.文件介绍 /etc/fstab这个文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作.作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分 ...
- 设计模式之Programming to an Interface, not anImplementation 程序指向接口,而不是实现
Class inheritance is basically just a mechanism for extending an application's functionality by reus ...
- JSTL核心标签
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- webpack 通用模块(每个页面都用到的js)编译
1.项目目录 2.配置文件:webpack.config.js var htmlWebpackPlugin = require('html-webpack-plugin'); var webpack ...
- MS SQL得到指定日期的当月月末
MS SQL得到指定日期的当月月末 declare @ddate date ,,)) select @ddate --2016-01-31 declare @ddatetime datetime ,, ...
- Linux下统计当前文件夹下的文件个数、目录个数(转)
1) 统计当前文件夹下文件的个数 代码如下: ls -l |grep "^-"|wc -l 2) 统计当前文件夹下目录的个数 代码如下: ls -l |grep "^d& ...
- UI_storyboard实现页面回调
新建类 注意继承关系 #import <UIKit/UIKit.h> @interface CustomPopIt : UIStoryboardSegue @end #import &qu ...
- Android中对Handle机制的理解
一.重要參考资料 [參考资料] 眼下来看,以下的几个网址中的内容质量比較不错.基本不须要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye. ...