文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA 如何实现解密RSA算法并使用JS加密

2023-05-31 16:00

关注

JAVA 如何实现解密RSA算法并使用JS加密?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

JAVA 中解密RSA算法JS加密实例详解

有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 。

java代码

需要依赖 commons-codec 包

RSACoder.Java

import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;public class RSACoder {  public static final String KEY_ALGORITHM = "RSA";  public static final String SIGNATURE_ALGORITHM = "MD5withRSA";  private static final String PUBLIC_KEY = "RSAPublicKey";  private static final String PRIVATE_KEY = "RSAPrivateKey";  public static byte[] decryptBASE64(String key) {    return Base64.decodeBase64(key);  }  public static String encryptBASE64(byte[] bytes) {    return Base64.encodeBase64String(bytes);  }    public static String sign(byte[] data, String privateKey) throws Exception {    // 解密由base64编码的私钥    byte[] keyBytes = decryptBASE64(privateKey);    // 构造PKCS8EncodedKeySpec对象    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    // KEY_ALGORITHM 指定的加密算法    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    // 取私钥匙对象    PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);    // 用私钥对信息生成数字签名    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);    signature.initSign(priKey);    signature.update(data);    return encryptBASE64(signature.sign());  }    public static boolean verify(byte[] data, String publicKey, String sign)      throws Exception {    // 解密由base64编码的公钥    byte[] keyBytes = decryptBASE64(publicKey);    // 构造X509EncodedKeySpec对象    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);    // KEY_ALGORITHM 指定的加密算法    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    // 取公钥匙对象    PublicKey pubKey = keyFactory.generatePublic(keySpec);    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);    signature.initVerify(pubKey);    signature.update(data);    // 验证签名是否正常    return signature.verify(decryptBASE64(sign));  }  public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{    // 对密钥解密    byte[] keyBytes = decryptBASE64(key);    // 取得私钥    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);    // 对数据解密    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.DECRYPT_MODE, privateKey);    return cipher.doFinal(data);  }    public static byte[] decryptByPrivateKey(String data, String key)      throws Exception {    return decryptByPrivateKey(decryptBASE64(data),key);  }    public static byte[] decryptByPublicKey(byte[] data, String key)      throws Exception {    // 对密钥解密    byte[] keyBytes = decryptBASE64(key);    // 取得公钥    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicKey = keyFactory.generatePublic(x509KeySpec);    // 对数据解密    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.DECRYPT_MODE, publicKey);    return cipher.doFinal(data);  }    public static byte[] encryptByPublicKey(String data, String key)      throws Exception {    // 对公钥解密    byte[] keyBytes = decryptBASE64(key);    // 取得公钥    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicKey = keyFactory.generatePublic(x509KeySpec);    // 对数据加密    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.ENCRYPT_MODE, publicKey);    return cipher.doFinal(data.getBytes());  }    public static byte[] encryptByPrivateKey(byte[] data, String key)      throws Exception {    // 对密钥解密    byte[] keyBytes = decryptBASE64(key);    // 取得私钥    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);    // 对数据加密    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.ENCRYPT_MODE, privateKey);    return cipher.doFinal(data);  }    public static String getPrivateKey(Map<String, Key> keyMap)      throws Exception {    Key key = (Key) keyMap.get(PRIVATE_KEY);    return encryptBASE64(key.getEncoded());  }    public static String getPublicKey(Map<String, Key> keyMap)      throws Exception {    Key key = keyMap.get(PUBLIC_KEY);    return encryptBASE64(key.getEncoded());  }    public static Map<String, Key> initKey() throws Exception {    KeyPairGenerator keyPairGen = KeyPairGenerator        .getInstance(KEY_ALGORITHM);    keyPairGen.initialize(1024);    KeyPair keyPair = keyPairGen.generateKeyPair();    Map<String, Key> keyMap = new HashMap(2);    keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥    keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥    return keyMap;  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯