1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Android中Sha1加密和RSA加密解密(记录)

Android中Sha1加密和RSA加密解密(记录)

时间:2020-09-27 21:05:43

相关推荐

Android中Sha1加密和RSA加密解密(记录)

一、SHA-1加密

/*** SHA-1加密工具类*/public class SHA1Util {/*** SHA-1加密字符串** @param info* @return*/public static String getSHA(String info) {byte[] bytesSHA = null;try {// 得到一个SHA-1的消息摘要MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");// 添加要进行计算摘要的信息messageDigest.update(info.getBytes());// 得到该摘要bytesSHA = messageDigest.digest();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}String strSHA = byteToHex(bytesSHA);return strSHA;}/*** Bytes数组转换为字符串** @param bytes* @return*/private static String byteToHex(byte[] bytes) {String hs = "";String temp;for (byte b : bytes) {temp = (Integer.toHexString(b & 0XFF));if (temp.length() == 1) {hs = hs + "0" + temp;} else {hs = hs + temp;}}return hs;}}

二、RSA加密与解密

/*** RSA加密解密工具类*/public class RSAUtil {public static final String RSA = "RSA";// 非对称加密密钥算法public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes(); // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数/*** 字符串转化为公钥** @param key* @return* @throws Exception*/public static PublicKey getPublicKey(String key) throws Exception {byte[] keyBytes;keyBytes = (new BASE64Decoder()).decodeBuffer(key);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(keySpec);return publicKey;}/*** 字符串转化为私钥** @param key* @return* @throws Exception*/public static PrivateKey getPrivateKey(String key) throws Exception {byte[] keyBytes;keyBytes = (new BASE64Decoder()).decodeBuffer(key);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(keySpec);return privateKey;}/*** 用公钥对字符串进行加密** @param data 原文*/public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {// 得到公钥X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);KeyFactory kf = KeyFactory.getInstance(RSA);PublicKey keyPublic = kf.generatePublic(keySpec);// 加密数据Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);cp.init(Cipher.ENCRYPT_MODE, keyPublic);return cp.doFinal(data);}/*** 私钥加密** @param data 待加密数据* @param privateKey 密钥* @return byte[] 加密数据*/public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {// 得到私钥PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);KeyFactory kf = KeyFactory.getInstance(RSA);PrivateKey keyPrivate = kf.generatePrivate(keySpec);// 数据加密Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);return cipher.doFinal(data);}/*** 公钥解密** @param data待解密数据* @param publicKey 密钥* @return byte[] 解密数据*/public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {// 得到公钥X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);KeyFactory kf = KeyFactory.getInstance(RSA);PublicKey keyPublic = kf.generatePublic(keySpec);// 数据解密Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);cipher.init(Cipher.DECRYPT_MODE, keyPublic);return cipher.doFinal(data);}/*** 使用私钥进行解密** @param encrypted* @param privateKey* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {// 得到私钥PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);KeyFactory kf = KeyFactory.getInstance(RSA);PrivateKey keyPrivate = kf.generatePrivate(keySpec);// 解密数据Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);cp.init(Cipher.DECRYPT_MODE, keyPrivate);byte[] arr = cp.doFinal(encrypted);return arr;}/*** 用公钥对字符串进行分段加密** @param data* @param publicKey* @return* @throws Exception*/public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception {int dataLen = data.length;if (dataLen <= DEFAULT_BUFFERSIZE) {return encryptByPublicKey(data, publicKey);}List<Byte> allBytes = new ArrayList<Byte>(2048);int bufIndex = 0;int subDataLoop = 0;byte[] buf = new byte[DEFAULT_BUFFERSIZE];for (int i = 0; i < dataLen; i++) {buf[bufIndex] = data[i];if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {subDataLoop++;if (subDataLoop != 1) {for (byte b : DEFAULT_SPLIT) {allBytes.add(b);}}byte[] encryptBytes = encryptByPublicKey(buf, publicKey);for (byte b : encryptBytes) {allBytes.add(b);}bufIndex = 0;if (i == dataLen - 1) {buf = null;} else {buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];}}}byte[] bytes = new byte[allBytes.size()];{int i = 0;for (Byte b : allBytes) {bytes[i++] = b.byteValue();}}return bytes;}/*** 分段加密** @param data 要加密的原始数据* @param privateKey 秘钥*/public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey) throws Exception {int dataLen = data.length;if (dataLen <= DEFAULT_BUFFERSIZE) {return encryptByPrivateKey(data, privateKey);}List<Byte> allBytes = new ArrayList<Byte>(2048);int bufIndex = 0;int subDataLoop = 0;byte[] buf = new byte[DEFAULT_BUFFERSIZE];for (int i = 0; i < dataLen; i++) {buf[bufIndex] = data[i];if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {subDataLoop++;if (subDataLoop != 1) {for (byte b : DEFAULT_SPLIT) {allBytes.add(b);}}byte[] encryptBytes = encryptByPrivateKey(buf, privateKey);for (byte b : encryptBytes) {allBytes.add(b);}bufIndex = 0;if (i == dataLen - 1) {buf = null;} else {buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];}}}byte[] bytes = new byte[allBytes.size()];{int i = 0;for (Byte b : allBytes) {bytes[i++] = b.byteValue();}}return bytes;}/*** 公钥分段解密** @param encrypted 待解密数据* @param publicKey 密钥*/public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey) throws Exception {int splitLen = DEFAULT_SPLIT.length;if (splitLen <= 0) {return decryptByPublicKey(encrypted, publicKey);}int dataLen = encrypted.length;List<Byte> allBytes = new ArrayList<Byte>(1024);int latestStartIndex = 0;for (int i = 0; i < dataLen; i++) {byte bt = encrypted[i];boolean isMatchSplit = false;if (i == dataLen - 1) {// 到data的最后了byte[] part = new byte[dataLen - latestStartIndex];System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);byte[] decryptPart = decryptByPublicKey(part, publicKey);for (byte b : decryptPart) {allBytes.add(b);}latestStartIndex = i + splitLen;i = latestStartIndex - 1;} else if (bt == DEFAULT_SPLIT[0]) {// 这个是以split[0]开头if (splitLen > 1) {if (i + splitLen < dataLen) {// 没有超出data的范围for (int j = 1; j < splitLen; j++) {if (DEFAULT_SPLIT[j] != encrypted[i + j]) {break;}if (j == splitLen - 1) {// 验证到split的最后一位,都没有break,则表明已经确认是split段isMatchSplit = true;}}}} else {// split只有一位,则已经匹配了isMatchSplit = true;}}if (isMatchSplit) {byte[] part = new byte[i - latestStartIndex];System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);byte[] decryptPart = decryptByPublicKey(part, publicKey);for (byte b : decryptPart) {allBytes.add(b);}latestStartIndex = i + splitLen;i = latestStartIndex - 1;}}byte[] bytes = new byte[allBytes.size()];{int i = 0;for (Byte b : allBytes) {bytes[i++] = b.byteValue();}}return bytes;}/*** 使用私钥分段解密** @param encrypted* @param privateKey* @return* @throws Exception*/public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {int splitLen = DEFAULT_SPLIT.length;if (splitLen <= 0) {return decryptByPrivateKey(encrypted, privateKey);}int dataLen = encrypted.length;List<Byte> allBytes = new ArrayList<Byte>(1024);int latestStartIndex = 0;for (int i = 0; i < dataLen; i++) {byte bt = encrypted[i];boolean isMatchSplit = false;if (i == dataLen - 1) {// 到data的最后了byte[] part = new byte[dataLen - latestStartIndex];System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);byte[] decryptPart = decryptByPrivateKey(part, privateKey);for (byte b : decryptPart) {allBytes.add(b);}latestStartIndex = i + splitLen;i = latestStartIndex - 1;} else if (bt == DEFAULT_SPLIT[0]) {// 这个是以split[0]开头if (splitLen > 1) {if (i + splitLen < dataLen) {// 没有超出data的范围for (int j = 1; j < splitLen; j++) {if (DEFAULT_SPLIT[j] != encrypted[i + j]) {break;}if (j == splitLen - 1) {// 验证到split的最后一位,都没有break,则表明已经确认是split段isMatchSplit = true;}}}} else {// split只有一位,则已经匹配了isMatchSplit = true;}}if (isMatchSplit) {byte[] part = new byte[i - latestStartIndex];System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);byte[] decryptPart = decryptByPrivateKey(part, privateKey);for (byte b : decryptPart) {allBytes.add(b);}latestStartIndex = i + splitLen;i = latestStartIndex - 1;}}byte[] bytes = new byte[allBytes.size()];{int i = 0;for (Byte b : allBytes) {bytes[i++] = b.byteValue();}}return bytes;}}

备注:

(1)BASE64Encoder需要添加jar包到项目中。下载连接:/s/1t3IQKYDe-tlEHRlDP4Ufbg

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。