DES、RSA(分段加解密) Android中常用的两种加密方式
16lz
2023-05-28
DES加解密
public class DESEncrypt { /** * DES解密 * @param decryptString 密文 * @param ivStr 加密key * @param keyStr 加密偏移量 * @return 明文 * @throws Exception exception */ public static String decrypt(String decryptString, String keyStr, String ivStr) throws Exception { IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); SecretKeySpec key = new SecretKeySpec(keyStr.getBytes(), "DES"); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key, iv); return new String(cipher.doFinal(Base64.decode(decryptString, Base64.NO_WRAP))); } /** * DES加密 * @param encryptString 明文 * @param keyStr 解密key * @param ivStr 偏移量 * @return 密文 * @throws Exception exception */ public static String encrypt(String encryptString, String keyStr, String ivStr) throws Exception { IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); DESKeySpec dks = new DESKeySpec(keyStr.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); return new String(Base64.encode(cipher.doFinal(encryptString.getBytes()), Base64.NO_WRAP)); }}
RSA加解密(支持RSA分段加解密),因为RSA加解密本身对明文或者密文的长度有限制,所以这里我们的加密算法可以支持分段加解密。
public class RSAEncrypt { /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; /** * 将base64编码后的公钥字符串转成PublicKey实例 * @param publicKey 公钥字符 * @return publicKEY * @throws Exception exception */ public static PublicKey getPublicKey(String publicKey) throws Exception { byte[] keyBytes = Base64.decode(publicKey, Base64.NO_WRAP); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(keySpec); } /** * 将base64编码后的私钥字符串转成PrivateKey实例 * @param privateKey 私钥字符串 * @return 私钥对象 * @throws Exception exception */ public static PrivateKey getPrivateKey(String privateKey) throws Exception { byte[] keyBytes = Base64.decode(privateKey, Base64.NO_WRAP); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePrivate(keySpec); } /** * RSA加密 * @param content 待加密文本 * @param publicKey 公钥 * @return 密文 * @throws Exception exception */ public static String encrypt(String content, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//java默认"RSA"="RSA/ECB/PKCS1Padding" cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] data = content.getBytes(); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); return new String(Base64.encode(encryptedData, Base64.NO_WRAP)); } /** * RSA解密 * @param content 密文 * @param privateKey 私钥 * @return 明文 * @throws Exception exception */ public static String decrypt(String content, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] encryptedData = Base64.decode(content, Base64.NO_WRAP); int inputLen = encryptedData.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); return new String(decryptedData); }}
RSA使用公钥进行加密,私钥进行解密。通常情况下,公钥由客户端进行保存,网络请求的时候对数据使用公钥加密。私钥通常保存在服务端,服务端对网络请求使用私钥进行解密。这样可以保障网络请求时候的数据安全!
RSA的公钥和私钥可以在线申请。RSA密钥在线生成
更多相关文章
- android加密解密完美教程
- android 中使用TextView实现分段显示不同颜色的字符串
- 安卓9.0 http请求数据失败解决办法
- android java 3des加密 ECB/CBC
- android客户端加密代码
- Android(安卓)采用MD5注册登录,加密解密
- Android中base64加密后的字符串带有“\n”导致出错的问题解决
- 关于Android(安卓)混淆的内容总结
- Android关于短信加密