问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现用javascript实现rsa加解密

发布网友 发布时间:2022-04-22 09:37

我来回答

3个回答

热心网友 时间:2022-04-18 08:04

服务端生成公钥与私钥,保存。

客户端在请求到登录页面后,随机生成一字符串。

后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串

将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

步骤:

服务端的RSA  Java实现:

/** 
 *  
 */  
package com.sunsoft.struts.util;  
  
import java.io.ByteArrayOutputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;  
import java.math.BigInteger;  
import java.security.KeyFactory;  
import java.security.KeyPair;  
import java.security.KeyPairGenerator;  
import java.security.NoSuchAlgorithmException;  
import java.security.PrivateKey;  
import java.security.PublicKey;  
import java.security.SecureRandom;  
import java.security.interfaces.RSAPrivateKey;  
import java.security.interfaces.RSAPublicKey;  
import java.security.spec.InvalidKeySpecException;  
import java.security.spec.RSAPrivateKeySpec;  
import java.security.spec.RSAPublicKeySpec;  
  
import javax.crypto.Cipher;  
  
  
  
/** 
 * RSA 工具类。提供加密,解密,生成密钥对等方法。 
 * 需要到
下载bcprov-jdk14-123.jar。 
 *  
 */  
public class RSAUtil {  
    /** 
     * * 生成密钥对 * 
     *  
     * @return KeyPair * 
     * @throws EncryptException 
     */  
    public static KeyPair generateKeyPair() throws Exception {  
        try {  
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",  
                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  
            final int KEY_SIZE = 1024;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低  
            keyPairGen.initialize(KEY_SIZE, new SecureRandom());  
            KeyPair keyPair = keyPairGen.generateKeyPair();  
            saveKeyPair(keyPair);  
            return keyPair;  
        } catch (Exception e) {  
            throw new Exception(e.getMessage());  
        }  
    }  
      
    public static KeyPair getKeyPair()throws Exception{  
        FileInputStream fis = new FileInputStream("C:/RSAKey.txt");  
         ObjectInputStream oos = new ObjectInputStream(fis);  
         KeyPair kp= (KeyPair) oos.readObject();  
         oos.close();  
         fis.close();  
         return kp;  
    }  
      
    public static void saveKeyPair(KeyPair kp)throws Exception{  
          
         FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");  
         ObjectOutputStream oos = new ObjectOutputStream(fos);  
         //生成密钥  
         oos.writeObject(kp);  
         oos.close();  
         fos.close();  
    }  
  
    /** 
     * * 生成公钥 * 
     *  
     * @param molus * 
     * @param publicExponent * 
     * @return RSAPublicKey * 
     * @throws Exception 
     */  
    public static RSAPublicKey generateRSAPublicKey(byte[] molus,  
            byte[] publicExponent) throws Exception {  
        KeyFactory keyFac = null;  
        try {  
            keyFac = KeyFactory.getInstance("RSA",  
                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  
        } catch (NoSuchAlgorithmException ex) {  
            throw new Exception(ex.getMessage());  
        }  
  
        RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(  
                molus), new BigInteger(publicExponent));  
        try {  
            return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);  
        } catch (InvalidKeySpecException ex) {  
            throw new Exception(ex.getMessage());  
        }  
    }  
  
    /** 
     * * 生成私钥 * 
     *  
     * @param molus * 
     * @param privateExponent * 
     * @return RSAPrivateKey * 
     * @throws Exception 
     */  
    public static RSAPrivateKey generateRSAPrivateKey(byte[] molus,  
            byte[] privateExponent) throws Exception {  
        KeyFactory keyFac = null;  
        try {  
            keyFac = KeyFactory.getInstance("RSA",  
                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  
        } catch (NoSuchAlgorithmException ex) {  
            throw new Exception(ex.getMessage());  
        }  
  
        RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(  
                molus), new BigInteger(privateExponent));  
        try {  
            return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);  
        } catch (InvalidKeySpecException ex) {  
            throw new Exception(ex.getMessage());  
        }  
    }  
  
    /** 
     * * 加密 * 
     *  
     * @param key 
     *            加密的密钥 * 
     * @param data 
     *            待加密的明文数据 * 
     * @return 加密后的数据 * 
     * @throws Exception 
     */  
    public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {  
        try {  
            Cipher cipher = Cipher.getInstance("RSA",  
                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  
            cipher.init(Cipher.ENCRYPT_MODE, pk);  
            int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024  
            // 加密块大小为127  
            // byte,加密后为128个byte;因此共有2个加密块,第一个127  
            // byte第二个为1个byte  
            int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小  
            int leavedSize = data.length % blockSize;  
            int blocksSize = leavedSize != 0 ? data.length / blockSize + 1  
                    : data.length / blockSize;  
            byte[] raw = new byte[outputSize * blocksSize];  
            int i = 0;  
            while (data.length - i * blockSize > 0) {  
                if (data.length - i * blockSize > blockSize)  
                    cipher.doFinal(data, i * blockSize, blockSize, raw, i  
                            * outputSize);  
                else  
                    cipher.doFinal(data, i * blockSize, data.length - i  
                            * blockSize, raw, i * outputSize);  
                // 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到  
                // ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了  
                // OutputSize所以只好用dofinal方法。  
  
                i++;  
            }  
            return raw;  
        } catch (Exception e) {  
            throw new Exception(e.getMessage());  
        }  
    }  
  
    /** 
     * * 解密 * 
     *  
     * @param key 
     *            解密的密钥 * 
     * @param raw 
     *            已经加密的数据 * 
     * @return 解密后的明文 * 
     * @throws Exception 
     */  
    public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {  
        try {  
            Cipher cipher = Cipher.getInstance("RSA",  
                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  
            cipher.init(cipher.DECRYPT_MODE, pk);  
            int blockSize = cipher.getBlockSize();  
            ByteArrayOutputStream bout = new ByteArrayOutputStream(64);  
            int j = 0;  
  
            while (raw.length - j * blockSize > 0) {  
                bout.write(cipher.doFinal(raw, j * blockSize, blockSize));  
                j++;  
            }  
            return bout.toByteArray();  
        } catch (Exception e) {  
            throw new Exception(e.getMessage());  
        }  
    }  
  
    /** 
     * * * 
     *  
     * @param args * 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  
        RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();  
        String test = "hello world";  
        byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());  
        byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);  
        System.out.println(new String(de_test));  
    }  
}

测试页面IndexAction.java:

/* 
 * Generated by MyEclipse Struts 
 * Template path: templates/java/JavaClass.vtl 
 */  
package com.sunsoft.struts.action;  
  
import java.security.interfaces.RSAPrivateKey;  
import java.security.interfaces.RSAPublicKey;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.apache.struts.action.Action;  
import org.apache.struts.action.ActionForm;  
import org.apache.struts.action.ActionForward;  
import org.apache.struts.action.ActionMapping;  
  
import com.sunsoft.struts.util.RSAUtil;  
  
/**  
 * MyEclipse Struts 
 * Creation date: 06-28-2008 
 *  
 * XDoclet definition: 
 * @struts.action validate="true" 
 */  
public class IndexAction extends Action {  
    /* 
     * Generated Methods 
     */  
  
    /**  
     * Method execute 
     * @param mapping 
     * @param form 
     * @param request 
     * @param response 
     * @return ActionForward 
     */  
    public ActionForward execute(ActionMapping mapping, ActionForm form,  
            HttpServletRequest request, HttpServletResponse response)throws Exception {  
          
        RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();  
        String mole = rsap.getMolus().toString(16);  
        String empoent = rsap.getPublicExponent().toString(16);  
        System.out.println("mole");  
        System.out.println(mole);  
        System.out.println("empoent");  
        System.out.println(empoent);  
        request.setAttribute("m", mole);  
        request.setAttribute("e", empoent);  
        return mapping.findForward("login");  
    }  
}

通过此action进入登录页面,并传入公钥的 Molus 与PublicExponent的hex编码形式。

热心网友 时间:2022-04-18 09:22

用javascript实现rsa加解密的实现方式是通过PKCS完成的。
1、整个定义的function

function pkcs1pad2(s,n) {
if(n < s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
//UTF-8编码为变长字节,使用实际的字节来记录
if(c < 128) { // encode using utf-8
ba[--n] = c;
}
else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
}
else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
//实际输入拼装结束,将下一位赋值为0标记结束
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
//拼接随机非0字节
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
//这两位做简单的校验
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);
}
该方法中对UTF-8字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。
2、调用方法:;
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null) return null;
var c = this.doPublic(m);
if(c == null) return null;
var h = c.toString(16);
if((h.length & 1) == 0) return h; else return "0" + h;
}

热心网友 时间:2022-04-18 10:56

用javascript实现rsa加解密的实现方式是通过PKCS完成的。
1、整个定义的function

function pkcs1pad2(s,n) {
if(n < s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
//UTF-8编码为变长字节,使用实际的字节来记录
if(c < 128) { // encode using utf-8
ba[--n] = c;
}
else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
}
else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
//实际输入拼装结束,将下一位赋值为0标记结束
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
//拼接随机非0字节
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
//这两位做简单的校验
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);
}
该方法中对UTF-8字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。
2、调用方法:;
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null) return null;
var c = this.doPublic(m);
if(c == null) return null;
var h = c.toString(16);
if((h.length & 1) == 0) return h; else return "0" + h;
}
本回答由电脑网络分类达人 饶烽推荐
评论
0 0

育知同创教育 | 【0元入学,两周免费试听】
主营:培训【Java大数据,HTML5,VR,安卓】
给TA留言
其他回答

function RSAPowMod(txt, key, n) {
var a, b;
if (key % 2 == 0) {
a = 1
for (var i = 1; i <= key / 2; i++) {
b = (txt * txt) % n
a = (b * a) % n
}
} else {
a = txt
for (var i = 1; i <= key / 2; i++) {
b = (txt * txt) % n
a = (b * a) % n
}
}
return a;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
描写夏天的经典诗词(75首惊蛰诗词) 南瓜虾汤的做法 南瓜虾仁煲做法 南瓜虾煲是什么 有一个长方体体积是24立方厘米,底面是2厘米的正方形,侧面积是多少... 24 平米是多少平方 ...个连续自然数,体积是24立方厘米。它的表面积是多少平方 欧盟27国都有哪些 xlog是什么格式文件? 什么叫可数名词与不可数名词 android rsa加解密私钥和公钥怎么用 高分求java的RSA 和IDEA 加密解密算法 非常完整的rsa加密解密软件 有多完整 ios开发rsa加密怎么生成秘钥 rsa的加密算法可以使用什么软件实现密码加密 求RSA加密软件! 中远国际期货新手开户需要什么资料吗 做期货的朋友们,知道这几个公司是正规的吗。 可靠吗 期货平台是正规的吗? 中国在哪些产品上还有比较优势? 怎么设置苹果手机的id 现在的期货交易平台哪个是正规的?怎么判断? 国内的期货公司正规吗? 苹果手机怎么改id? 国内比较大比较好的期货公司有哪些 期货外盘是什么怎么玩的中远国际期货是真的吗 中远国际期货外汇真的有投资者盈利了吗 中远国际期货恒指真的能赚钱吗 中远国际期货做外盘期货受监管吗 怎么判断 中远国际期货公司如何中远国际期货客服怎么联系 如何在IOS中使用RSA加密,能够与.NET的服务器互通 如何在浏览器端实现RSA公私钥对生成,加解密 rsa加密rsa加密rsa加密? rsa加密法 详细解释 如何使用16进制编码的RSA公钥进行RSA加密 android 提交的rsa加密,服务端怎么解密 [求助}如何对excel进行RSA加密 银联支付接口使用rsa 数据加密。明文密钥都是16进制的字符串,加密结果和对方给的小工具加密的结果不一样 RSA加密解密问题 RSA加密算法,求大神帮解答 江苏成人高考有哪些优势,你知道吗? word文件的表格复制到&#127380;文件不显示是怎么回事 江苏成考录取分数线2021 word里面表格一页放不下,第二页不显示 江苏成人高考热门问题有哪些?成考小编告诉你! word里面粘贴表格怎么显示不出来 听说今后江苏成考越来越难? 江苏成人高考的入学考试难吗?要考多少分呀 梅艳芳是因为什么原因去世的? 江苏省成人高考