zoukankan      html  css  js  c++  java
  • RSA的JavaScript程序

    代码来自维基百科的RSA (cryptosystem)

    RSA的JavaScript程序如下:

    'use strict';
    
    /**
     * RSA hash function reference implementation.
     *
     * @namespace
     */
    var RSA = {};
    
    /**
     * Generates an RSA hash
     * https://en.wikipedia.org/wiki/RSA_(cryptosystem)#A_working_example
     *
     * @returns {array} Result of RSA generation
     */
    RSA.generate = function(){
        /**
         * Calculate modular multiplicative inverse.
         * https://en.wikipedia.org/wiki/Modular_multiplicative_inverse
         * Function based on PHP variant on http://rosettacode.org/wiki/Modular_inverse
         *
         * @param   {a} int
         * @param   {n} int
         * @returns {int} Result of modular multiplicative inverse.
         */
        function modular_multiplicative_inverse(a, n){
        	var t  = 0,
                nt = 1,
                r  = n,
                nr = a % n;
            if (n < 0){
            	n = -n;
            }
            if (a < 0){
            	a = n - (-a % n);
            }
        	while (nr !== 0) {
        		var quot= (r/nr) | 0;
        		var tmp = nt;  nt = t - quot*nt;  t = tmp;
        		    tmp = nr;  nr = r - quot*nr;  r = tmp;
        	}
        	if (r > 1) { return -1; }
        	if (t < 0) { t += n; }
        	return t;
        }
    
        /**
         * Generates a random prime
         *
         * @param   {min} int, minimal value
         * @param   {max} int, maximal value
         * @returns {int} a random generated prime
         */
        function random_prime(min, max){
            var p = Math.floor(Math.random() * ((max - 1) - min + 1)) + min;
            if(bigInt(p).isPrime()===true){
                return p;
            } else {
                return random_prime(min, max);   
            } 
        }
    
        // generate values
        var p = random_prime(1, 255), // 8 bit
            q = random_prime(1, 255), // 8 bit
            n = p * q,
            t = (p - 1) * (q - 1), // totient as φ(n) = (p − 1)(q − 1)
            e = random_prime(1, t),
            d = modular_multiplicative_inverse(e, t);
        return {
        	n: n, // public key (part I)
            e: e, // public key (part II)
            d: d  // private key
        };
    };
    
    /**
     * Encrypt
     * Uses BigInteger.js https://github.com/peterolson/BigInteger.js/tree/master
     *
     * @param   {m} int, the 'message' to be encoded
     * @param   {n} int, n value returned from generate_rsa() aka public key (part I)
     * @param   {e} int, e value returned from generate_rsa() aka public key (part II)
     * @returns {int} encrypted hash
     */
    RSA.encrypt = function(m, n, e){
    	return bigInt(m).pow(e).mod(n);   
    };
    
    /**
     * Decrypt
     * Uses BigInteger.js https://github.com/peterolson/BigInteger.js/tree/master
     *
     * @param   {mEnc} int, the 'message' to be decoded (encoded with RSA_encrypt())
     * @param   {d} int, d value returned from generate_rsa() aka private key
     * @param   {n} int, n value returned from generat
    
    e_rsa() aka public key (part I)
     * @returns {int} decrypted hash
     */
    RSA.decrypt = function(mEnc, d, n){
    	return bigInt(mEnc).pow(d).mod(n);   
    };



  • 相关阅读:
    moment JS 时间操作指南
    react 项目使用 echarts-wordcloud(文字云)
    moment实现计算两个时间的差值
    JS实现回到页面顶部的五种写法(从实现到增强)
    关于谷歌浏览器携带cookie失效解决方案
    Axios发送请求下载文件(重写二进制流文件)
    修改 input / textarea placeholder 属性的颜色和字体大小
    js实现数组浅拷贝和深拷贝
    JS中的可枚举属性与不可枚举属性
    物流管理
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564857.html
Copyright © 2011-2022 走看看