openssl c AES/CBC/PKCS5Padding 与java代码对应

 1     char encrypt_string[4096] = { 0 };
 2     AES_KEY aes;
 3     char key[17] = "quck7295abvdefgh";
 4     char iv[17] = "abcdefgh3762quck";
 5     std::string input_string = "45b00417-f7ca-4f53-bced-c1743d85604";
 6     int nLen = input_string.length();
 7
 8     int nBei = nLen / AES_BLOCK_SIZE + 1;
 9     int nTotal = nBei * AES_BLOCK_SIZE;
10     char *enc_s = (char*)malloc(nTotal);
11     int nNumber;
12     if (nLen % 16 > 0)
13         nNumber = nTotal - nLen;
14     else
15         nNumber = 16;
16     memset(enc_s, nNumber, nTotal);
17     memcpy(enc_s, input_string.data(), nLen);
18
19     if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) {
20         fprintf(stderr, "Unable to set encryption key in AES\n");
21         exit(-1);
22     }
23
24     AES_cbc_encrypt((unsigned char *)enc_s, (unsigned char*)encrypt_string, nBei * 16, &aes, (unsigned char*)iv, AES_ENCRYPT);
25
26
27     std::string enstr = boost::lexical_cast<std::string>(encrypt_string);
28     std::string base64 = base64_encode(enstr);
29
30     std::cout << base64 << std::endl;

KCS5Padding:填充的原则是,如果长度少于16个字节,需要补满16个字节,补(16-len)个(16-len)例如:

huguPozhen这个节符串是9个字节,16-9= 7,补满后如:huguozhen+7个十进制的7

如果字符串长度正好是16字节,则需要再补16个字节的十进制的16。

时间: 2024-08-09 23:49:39

openssl c AES/CBC/PKCS5Padding 与java代码对应的相关文章

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

php实现AES/CBC/PKCS5Padding加密解密

<?php class MagicCrypt { private $iv = "0102030405060708";//密钥偏移量IV private $encryptKey = "58e15e87488a47c9";//AESkey //加密 public function encrypt($encryptStr) { $localIV = $this->iv; $encryptKey = $this->encryptKey; //Open mo

java aes CBC的填充方式发现

如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来并base64的结果少了20位,于是把各个步骤中间结果打出来,发现并没有什么不同,然后尝试在golang后面强行追加了16个填充,那么填充什么呢?没错,我就是从0x0到0x10一个一个试出来的,最后发现当填充16个0x10时,golang跟java的加密结果就完全一样了,下面贴出golang跟jav

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[] ,是直接转

java实现AES/CBC/pack5padding加解密算法

最近要测试一个借口,借口的传值参数是使用AES加密,偏移量为0000000000000000,秘钥:12345678901234567890123456789012,加密后内容转成16进制发送,用网上的代码一直没实现,最后发送是因为jre的两个jar包需要升级,支持key大于16位. 两个jar包:US_export_policy.jar.local_policy.jar,下载地址:https://files.cnblogs.com/files/tech-test/security.zip 代码

AES加密CBC模式 IOS - Java 互通共用

AES加密模式和填充方式 算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度AES/CBC/NoPadding             16                          不支持AES/CBC/PKCS5Padding          32                          16AES/CBC/ISO10126Padding       32                          16AE

CBC之php java兼容版本

网上搜了N多代码,都是你抄我的,我抄你的,着实让人无语对苍天.经过多番资料的查找,php与java的cbc加密.解密结果终于一致了,代码如下: Java加密解密类: package main; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base

AES加密解密在JAVA和ANDROID下互通

<span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样,于是百度搜索发现还真是!</span> 贴上AES加密核心: Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv); CBC是