java小学妹半夜打电话哭诉:刚入职竟然就要。。。。。。
Posted 剑行歌之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java小学妹半夜打电话哭诉:刚入职竟然就要。。。。。。相关的知识,希望对你有一定的参考价值。
人在家中坐,瓜从天上来
昨天晚上,恰逢夜深人静,正是撸代码的好时候,突然接到小学妹的电话,小学妹跟我一顿哭,把我给愁的,赶紧一顿关心
等学妹缓过来之后,终于了解了来龙去脉,原来学妹刚入职进公司,上级就让她对接银行系统接口。emmm,大家都知道,银行系统大多是RSA加密数据交互的,小学妹这块完全不懂,弄了一天还没有搞定。我一听,嘿嘿,这下该我上场表演了,说不定十四亿的爱情终于轮到我了呢。
公钥加密
/**
* 公钥加密
*
* @param data 源数据
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String publicKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicK);
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 encryptedData;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
私钥解密
/**
* 私钥解密
*
* @param encryptedData 已加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateK);
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 decryptedData;
} catch (Exception ex) {
}
return null;
}
重点来了,我们进行加解密的数据长度肯定是超过了128的,如果我们不做分段加解密的话,就会出现如下所示的错误:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2223)
at com.lwx.utils.RSAUtils.decryptByPrivateKey(RSAUtils.java:124)
at com.lwx.utils.RSAUtils.main(RSAUtils.java:294)
此处附上完整版
下载链接: https://gitee.com/luowenxing/utils/blob/master/src/main/java/com/lwx/utils/RSAUtils.java.
public class RSAUtils {
/**
* 加密算法RSA
*/
public static final String RSA_KEY_ALGORITHM = "RSA";
/**
* 加密算法RSA
*/
public static final String AES_KEY_ALGORITHM = "AES";
/**
* 签名算法
*/
public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
/**
* RSA最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 用私钥对信息生成数字签名
*
* @param data 加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateK);
signature.update(data);
return MyBase64Utils.encodeStringForString(signature.sign());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 校验数字签名
*
* @param data 加密数据
* @param publicKey 公钥
* @param sign 数字签名
* @return
* @throws Exception
*/
public static boolean verify(byte[] data, String publicKey, String sign) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicK);
signature.update(data);
return signature.verify(MyBase64Utils.decodeStringForByte(sign));
} catch (Exception ex) {
}
return false;
}
/**
* 私钥解密
*
* @param encryptedData 已加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateK);
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 decryptedData;
} catch (Exception ex) {
}
return null;
}
/**
* 公钥解密
*
* @param encryptedData 已加密数据
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicK);
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 decryptedData;
} catch (Exception ex) {
}
return null;
}
/**
* 公钥加密
*
* @param data 源数据
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String publicKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicK);
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 encryptedData;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 私钥加密
*
* @param data 源数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String privateKey) {
try {
byte[] keyBytes = MyBase64Utils.decodeStringForByte(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateK);
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 encryptedData;
}catch (Exception e){
}
return null;
}
//生成密钥对
public static KeyPair genKeyPair(int keyLength) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
return keyPairGenerator.generateKeyPair();
}
}
到这里呢,就搞定了。emmmmm,当然只搞定了代码,小学妹拿着代码就溜了,唉!大家三连安慰下我这受伤的小心脏吧。
以上是关于java小学妹半夜打电话哭诉:刚入职竟然就要。。。。。。的主要内容,如果未能解决你的问题,请参考以下文章
小学妹半夜发信息给我:怎样可以在暑假不花一分钱,把计算机证拿到手?计算机等级备考攻略大总结
小学妹半夜发信息给我:怎样可以在暑假不花一分钱,把计算机证拿到手?计算机等级备考攻略大总结
小学妹半夜发信息给我:怎样可以在暑假不花一分钱,把计算机证拿到手?计算机等级备考攻略大总结
小学妹半夜发信息给我:怎样可以在暑假不花一分钱,把计算机证拿到手?计算机等级备考攻略大总结