JavaScript RSA算法简单实现(转)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 <HTML>
 <HEAD>
 <TITLE> New Document </TITLE>
 <META NAME="Generator" CONTENT="EditPlus">
 <META NAME="Author" CONTENT="">
 <META NAME="Keywords" CONTENT="">
 <META NAME="Description" CONTENT="">
 </HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
// ==================================================================
// JavaScript RSA算法简单实现
// Know Bugs:
//   1. Math.pow存在计算精度问题,因此不能选取较大的质数,否则会溢出
// By midea0978
// date:2005-08-10
// 参考文献
//    1.RSA算法研究 http://www.cnblogs.com/midea0978/articles/65244.html
//    2.PKCS #1: RSA Cryptography Specifications Version 2.0
//           http://www.faqs.org/rfcs/rfc2437.html 
// ==================================================================
RSAAlgorithm()
function RSAAlgorithm(){
 //1.首先选择两个简单的质数p,q
 var p=5
 var q=13
var n=p*q 
 //随机选择余数r,保证r与(p-1)*(q-1)=48互质
 var r=7 
 //得到private key是p,q,r
 document.write("----------------------------------<br>");
 document.write("<B>Private Key:</B><br>");
 document.write("p= "+p+"<br>");
 document.write("q= "+q+"<br>");
 document.write("r= "+r+"<br>");
 document.write("----------------------------------<br>");
 //2.计算public key
 //找到m,保证rm ==1 mod (p-1)*(q-1)
 var num=0
 for(a=0;a<500;a++){
  if(r*a%((p-1)*(q-1))==1){
   num=a;
   break;
  }
 }
 var m=num 
 if(m>0){
  document.write("<br>找到m= "+num+" ,计算余数="+(num*r)%((p-1)*(q-1))+",成功!<br>")
 }
 else{
  document.write("找不到满足条件的m,请调整参数");
 }
 document.write("----------------------------------<br>");
 document.write("<B>Public Key:<br></B>");
 document.write("m= "+m+"<br>");
 document.write("n= "+n+"<br>");
 document.write("----------------------------------<br>");
 document.write("<br>");
 document.write("<B>#演示加密过程#</B><br>");
 var text=20 //明文
 document.write("明文="+text+"<br>");
 //接下来, 计算 etext == text^r mod n, (0 <= b < n)
 var etext=Math.pow(text,r)%n;
 document.write("加密后的内容:"+etext+"<br>");
 document.write("<br>");
 document.write("#演示解密过程#<br>");
 //text=etext^m mod pq
 var text=Math.pow(etext,m)%n;
 document.write("解密后的内容:"+text+"<br>");
}
/**//*
JAVA下面的简单实现
import java.math.BigInteger;
public class RSAAlgorithm {
    public static void main(String[] args) {
  BigInteger p = new BigInteger("5");    //P
  BigInteger q = new BigInteger("13");    //Q
        BigInteger n = new BigInteger("65");    //N
        BigInteger r = new BigInteger("7");

        BigInteger biginteger = new BigInteger("20");
        BigInteger biginteger1 = biginteger.modPow(r, n);
        System.out.println("加密数据:" + biginteger1);
        BigInteger m = r.modInverse(new BigInteger("48"));
        System.out.println("m:" + m);
        BigInteger biginteger2 = biginteger1.modPow(m, n);
        System.out.println("解密数据:" + biginteger2);
    }
}
*/
//-->
</SCRIPT>
</BODY>
</HTML>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA算法是一种非对称加密算法,常用于数据加密和数字签名等。在前端使用js实现RSA算法加密,后端使用Java实现RSA算法解密,具体步骤如下: 前端(js)实现: 1. 生成RSA密钥对,代码如下: ```javascript function generateRSAKey() { var crypt = new JSEncrypt({ default_key_size: 1024 }); crypt.getKey(); return crypt; } ``` 2. 使用公钥加密数据,代码如下: ```javascript function encryptData(data, publicKey) { var crypt = new JSEncrypt(); crypt.setKey(publicKey); var encryptedData = crypt.encrypt(data); return encryptedData; } ``` 后端(Java)实现: 1. 使用私钥解密数据,代码如下: ```java public static String decryptData(String data, String privateKey) throws Exception { byte[] dataBytes = Base64.decodeBase64(data); byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateK); byte[] decryptedData = cipher.doFinal(dataBytes); return new String(decryptedData); } ``` 2. 生成RSA密钥对,代码如下: ```java public static Map<String, String> generateRSAKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, String> keyMap = new HashMap<String, String>(); keyMap.put("publicKey", Base64.encodeBase64String(publicKey.getEncoded())); keyMap.put("privateKey", Base64.encodeBase64String(privateKey.getEncoded())); return keyMap; } ``` 注意:在前端和后端使用RSA算法加密和解密的时候,需要使用相同的密钥对(即公钥和私钥)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值