之前在做一个项目时,要求安全性,于是就用到了RSA和AES加密。
我的部分就是完成安卓端的编写,别人在C#端把服务器写好了,不是很会RSA加密于是就在Java项目下完成RSA加密算法的编写,之后又实现了AES加解密。
但是发现一个小问题,那就是我知道了密钥,可是Java端能够完美加解密,可是安卓就是不可以,后来发现C#和Java都有默认填充模式和加密模式,不用指定,可是安卓就需要指定才能得到正确的密文和明文。
现在贴一些安卓的代码:
1.RAS已知 密钥,加解密,需要关注的是 Cipher.getInstance(\"RSA/NONE/PKCS1Padding\");这一句
// 公钥加密
public static byte[] Encrypt(byte[] content) throws Exception {
// 创建RSA加密方式
Cipher cipher = Cipher.getInstance(\"RSA/NONE/PKCS1Padding\");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] bytes = {};
// 分块儿加密并且组装
for (int i = 0; i < content.length; i += 117) {
int bolckSize = content.length - i;
bolckSize = bolckSize >= 117 ? 117 : bolckSize;
byte[] byteClip = new byte[bolckSize];
System.arraycopy(content, i, byteClip, 0, bolckSize);
bytes = unitByteArray(bytes, cipher.doFinal(byteClip));
}
return bytes;
}
// 公钥加密
public static byte[] Encrypt(JSON json ) throws Exception {
byte[] jsonBytes = json .toString().getBytes(\"UTF-8\");
return Encrypt(jsonBytes);
}
// 获取公钥对象
private static RSAPublicKey getRSAPublicKey(String Modulus, String Exponent) {
RSAPublicKey publicKey = null;
try {
byte[] m = 64.decode(Modulus.getBytes(), 64.NO_WRAP);
byte[] e = 64.decode(Exponent.getBytes(), 64.NO_WRAP);
BigInteger b1 = new BigInteger(1, m);
BigInteger b2 = new BigInteger(1, e);
KeyFactory keyFactory = KeyFactory.getInstance(\"RSA\");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
// 初始化publicKey
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
System.out.println(\"获取公钥对象失败!\");
}
return publicKey;
}
2.AES加解密
public static byte[] Encrypt(byte[] data, byte[] key, byte[] IV) {
byte[] encrypted = {};
try {
SecretKeySpec skeySpec = new SecretKeySpec(key, \"AES\");
Cipher cipher = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(IV));
encrypted = cipher.doFinal(data);
} catch (Exception e) {
}
return encrypted;
}
//AES解密
public static byte[] Decrypt(byte[] data, byte[] Key, byte[] IV) {
byte[] result = {};
try {
SecretKeySpec skeySpec = new SecretKeySpec(Key, \"AES\");
// 创建密码器
Cipher cipher = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");
// 初始化解密器
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(IV));
// 解密
result = cipher.doFinal(data);
} catch (Exception e) {
}
return result;
}
继续阅读与本文标签相同的文章
下一篇 :
从零开始学html5视频能学会吗?
-
AI+5G科技创新 视频行业呈现轻应用化趋势
2026-05-14栏目: 教程
-
1.98亿滴滴用户添加了紧急联系人 每天百万个订单行程分享给亲友
2026-05-14栏目: 教程
-
工程院院士刘韵洁:5G前景很大,但主要是行业应用
2026-05-14栏目: 教程
-
陆奇:看好5G技术,但应用好5G还需要时间
2026-05-14栏目: 教程
-
在Visual Studio中使用clang-tidy进行代码分析
2026-05-14栏目: 教程
