c 与java联调rsa加密问题_AES和RSA加密的组合使用(二)

每一个写接口的人都是天使,后来对接的时候折翼了。 ---心疼自己

好几天没有继续更新,主要是被卡在了对接上,已经全部调通,代码还是经得起考验的。

这次主要是关于AES加密的部分,做的一些代码实现,并可以和IOS,安卓端完美对接。

加解密的算法注入方式采用:AES/CBC/PKCS7Padding

测试了多种注入:NoPadding PKCS5Padding PKCS7Padding 等,但是在联调时出现以下问题:

1.IOS只能够使用NoPadding 和 PKCS7Padding 的方式注入,java端可以使用PKCS5Padding(JDK) 或者PKCS7Padding(BC)的方式接受。

2.安卓端代码和java后端代码类似,所有 使用相同的注入方式是是通的,PKCS5Padding(来自JDK) 和PKCS7Padding(来自BC)。NoPadding 未做测试。

3.关于传说中的Linux下安卓端加密由于key生成的方式不同,会在后台解密出现乱码情况。KeyGenerator kg = KeyGenerator.getInstance("AES");

kg.init(128,new SecureRandom());亲测可用。

4.加解密的时候设置偏移量,原因IOS端将偏移量设置为null会出现,解密失败(我不清楚IOS到底有没有不需要偏移量的函数),解决方案安卓IOS后台使用相同的偏移量设置就OK了。

↓↓↓↓↓↓上代码:

package aes;

import java.security.Key;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**

* AES安全编码组件

* @author zhaofh 2016-07-06

* @version 1.0

* @since 1.0

*/

public abstract class AESUtil extends BaseCoder {

/**

* ALGORITHM 算法

* AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available

*/

public static final String ALGORITHM = "AES";

private static String ivParameter = "0102030405060708";//偏移量,可自行修改

/**

* 转换密钥

*

* @param key

* @return

* @throws Exception

*/

private static Key toKey(byte[] key) throws Exception {

SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);

return secretKey;

}

/**

* 解密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decrypt(byte[] data, String key) throws Exception {

Key k = toKey(AESUtil.decryptBASE64(key));

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",new BouncyCastleProvider());

// Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());

cipher.init(Cipher.DECRYPT_MODE, k,iv);

return cipher.doFinal(data);

}

/**

* 加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encrypt(byte[] data, String key) throws Exception {

Key k = toKey(decryptBASE64(key));

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",new BouncyCastleProvider());

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());

cipher.init(Cipher.ENCRYPT_MODE, k,iv);

return cipher.doFinal(data);

}

/**

* 生成密钥

*

* @return

* @throws Exception

*/

public static String initKey() throws Exception {

KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

kg.init(128,random);

//kg.init(128,new SecureRandom());↑↑↑↑↑↑↑↑上两行代码可换成这个

SecretKey secretKey = kg.generateKey();

return encryptBASE64(secretKey.getEncoded());

}

}

测试类:

package aes;

import ywsoftware.AESCoder;

/**

* @author zhaofh 2016年7月29日

*

*/

public class AESTest {

public static void main(String[] args) throws Exception {

String inputStr = "AES";

String key = AESCoder.initKey();

System.err.println("原文:\t" + inputStr);

System.err.println("密钥:\t" + key);

byte[] inputData = inputStr.getBytes();

inputData = AESCoder.encrypt(inputData, key);

System.err.println("加密后:\t" + AESCoder.encryptBASE64(inputData));

byte[] outputData = AESCoder.decrypt(inputData, key);

String outputStr = new String(outputData);

System.err.println("解密后:\t" + outputStr);

}

}

BaseCode代码戳这里→→→→BaseCode代码

最终选取IOS使用自带的PKCS7Padding方式注入。

以上代码安卓和JAVA通用。

IOS的AES加密代码←←←←IOS的AES加密代码戳这里

下一节讲下,关于加密,JDK BC CC的实现,以Base64为例贴出代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值