openssl c++实现bouncycastle中AES加解密
0x01 为什么要用bouncycastle
先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。
它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。它不对外出口,用它开发完成封装后将无法调用。由于美国出口控制规定,JCA是可出口的,但是JCE对部分国家是限制出口的。因此,要实现一个完整的安全结构,就需要一个活多个第三方厂商提供JCE产品,称为安全供应商。bouncycastle JCE就是其中一个安全供应者。
举个例子:
在向一个国际CA发送签名请求后,CA会返回PKCS12格式的个人信息交换文件(.p12,.pfx)。此时使用sun自带的提供者(provider)进行读取产生私钥信息(keystore)时,
KeyStore ks = KeyStore.getInstance("PKCS12", "SUN");ks.load(new FileInputStream("visa.p12"), "password".toCharArray());
可能(只是可能)会抛出
java.io.IOException: unsupported PKCS12 bag type 1.2.840.113549.1.12.10.1.1at com.sun.net.ssl.internal.ssl.PKCS12KeyStore.a(Unknown Source)at com.sun.net.ssl.internal.ssl.PKCS12KeyStore.engineLoad(Unknown Source)at java.security.KeyStore.load(Unknown Source)
这种情况就需要选用bouncycastle第三方完成读取产生私钥信息。
0x02 如何在JAVA环境中使用
第一步,首先到https://bouncycastle.org/latest_releases.html下载对应的jar包,我这里下载是bcprov-jdk14-143.jar
第二步,将bcprov-jdk14-143.jar拷贝到%JAVA_HOME%/jre1.8.0_60/lib/ext/目录下,并修改java_security文件
第三步,在eclipse中创建java工程
按向导创建
第四步,引入provider类名并注册使用
import org.bouncycastle.jce.provider.*;
Security.insertProviderAt((Provider)new BouncyCastleProvider(), 1);is = new BufferedInputStream(new FileInputStream(crypt12FileEnc));int length = is.available();System.out.println("length:" + length); cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(aesK, "AES"), new IvParameterSpec(aesIV)); isCipher = new CipherInputStream(is, cipher);os = new FileOutputStream(decryptedZlibFile);int templen = 0;while((read=isCipher.read(buffer))!=-1) { templen += read;System.out.println("read:" + read);os.write(buffer, 0, read); }System.out.println("allread:" + templen);os.close();is.close();
这个时候,可能会报java异常
exception:Illegal key size
java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.init(Cipher.java:1393)at javax.crypto.Cipher.init(Cipher.java:1327)at crypt12.main(crypt12.java:81)
这个时候美帝限制出口导致的,没关系我们去下载无限制的策略文件local_policy.jar和US_export_policy.jar替换jdk和jre下的两个j相同名字的ar包
- jdk对应jar包的路径:D:\Java\jdk1.8.0_60\jre\lib\security
- jre对应jar包的路径:D:\Java\jre1.8.0_60\lib\security
我这里是jdk8,所以对应的下载
地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
当然还有其他版本的:
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR
jdk6: http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
0x03 如何用openssl实现AES加解密
在openssl中EVP_CIPHER的使用跟java里面Cipher的使用及其相似,真怀疑是不是相互有借鉴。但要注意EVP_CIPHER_CTX_ctrl的使用是不可或缺的,在加解密中若忽略此函数的使用,会直接导致加解密失败,使用方法如下:
#define BUFFERSIZE 8192
EVP_CIPHER_CTX ctx;const EVP_CIPHER *cipher = EVP_aes_256_gcm();EVP_CIPHER_CTX_init(&ctx);EVP_CIPHER_CTX_set_padding(&ctx, 0);EVP_DecryptInit_ex(&ctx, cipher, NULL, NULL, NULL);EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL);EVP_DecryptInit_ex(&ctx, NULL, NULL, (unsigned char*)aesK, (unsigned char*)aesIV);int index = 0;std::ofstream zlibOfs(zlibFile.c_str(), std::ios::binary);while (needCryLen > 0){memset(buffer, 0, BUFFERSIZE);memcpy_s(buffer, BUFFERSIZE, cryBuffer + BUFFERSIZE * index, needCryLen <= BUFFERSIZE ? needCryLen - 20 : BUFFERSIZE);int outLen = 0;int decryOutLen = 0;EVP_DecryptUpdate(&ctx, (unsigned char*)outBuffer, &outLen, (unsigned char*)buffer, needCryLen <= BUFFERSIZE ? needCryLen - 20 : BUFFERSIZE);decryOutLen += outLen;EVP_DecryptFinal_ex(&ctx, (unsigned char*)outBuffer, &outLen);decryOutLen += outLen;zlibOfs.write(outBuffer, decryOutLen);index++;needCryLen = needCryLen - BUFFERSIZE;}zlibOfs.close();EVP_CIPHER_CTX_cleanup(&ctx);
openssl c++实现bouncycastle中AES加解密相关推荐
- C#中AES加解密和zip压缩
一.AES加解密方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Securi ...
- 【 Linux学习】Linux环境下利用OpenSSL对大文件进行AES加解密
一.背景 之前的几篇博客已经介绍了Gitlab如何备份恢复与迁移已经脚本监控过程等. git学习--> Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyan ...
- android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法
今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...
- QT 基于AES加解密的使用,解析java端发来的密文
背景 java端往ukey中写授权信息,C++端从ukey中读取授权信息. java端写入的授权信息是加密的,并且要可逆. 因为java端采用的是AES加密的,所以我(C++端)也只好采用对等形式搞定 ...
- java aes 工具类_Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- 利用openssl进行aes加解密
之前写过aes加密算法简单说明,本篇用openssl对aes的ecb和cbc模式进行代码编写. 现在拿128位的aes加解密进行说明. 首先强调的是,在openssl提供的函数中,加密和解密每次只能针 ...
- Openssl Aes加解密使用示例
Openssl Aes加解密使用示例 Aes简介 设置Aes密钥 Aes算法CBC加解密 Aes简介 Aes是分组加密算法,主要基于块加密,选取固定长度的密钥去加密明文中固定长度的块,生成的密文块与明 ...
- linux c openssl aes 加解密
1.OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是所有支持或者是部分支持. 返回值:"aes(full)&qu ...
- 使用openssl完成aes-cbc模式的数据加解密,输入和输出都是字符串的形式
代码 #include <cstring> #include <memory>#include <openssl/aes.h> #include <opens ...
最新文章
- R构建列联表(Contingency Table or crosstabs)
- python加颜色_Python 给屏幕打印信息加上颜色的实现方法
- python下载的文件放在哪里的-python实现下载文件的三种方法
- ANSYS——分析实例,平面对称问题
- redis安装redis集群
- servlet——三兄弟的另外两个:过滤器/监听器
- python 两个数据框合并计算_一文掌握Excel、SQL、Python【数据合并】大法!
- Android 系统(71)---Android系统build.prop文件生成过程
- 【递归】n个数的全排列
- 深度学习自学(十六):caffe-sphereface识别代码编译问题-caffe sudo make test报错
- 回答一个关于产品经理的入门门槛高不高的问题
- 交换机和路由器有什么区别
- sql 远程过程调用失败
- 有功功率和无功功率的超前滞后
- mysql 备库 1032_【MySQL 5.7 】从库1032 报错处理
- pion实现录制WebRTC流
- NOIP2018提高组省一冲奖班模测训练(三)
- 如何判断测试项目是否需要高频交直流电流探头
- 代码强力对比,就用这7个工具!
- Mac-OutLook农历日历的设置
热门文章
- www.sirim-global.com
- “阿基里斯与乌龟”的终结性思考
- ResourceManager里面Trackingui需要手动该ip
- 在XML里的XSD和DTD以及standalone的使用
- Web.Config文件配置之数据库连接配置
- 轻松学DIV教程(div+css布局)
- 03-list,set,数据结构,Collections
- linux mysql 5.6.14_CentOS 6.4下编译安装MySQL 5.6.14
- 不用math type解决word公式上浮问题
- java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...