• js版RSA算法


    // RSA, a suite of routines for performing RSA public-key computations in
    // JavaScript.
    //
    // Requires BigInt.js and Barrett.js.
    //
    // Copyright 1998-2005 David Shapiro.
    //
    // You may use, re-use, abuse, copy, and modify this code to your liking, but
    // please keep this header.
    //
    // Thanks!
    //
    // Dave Shapiro
    // dave@ohdave.com

    function RSAKeyPair(encryptionExponent, decryptionExponent, modulus)
    {
    this.e = biFromHex(encryptionExponent);
    this.d = biFromHex(decryptionExponent);
    this.m = biFromHex(modulus);
    // We can do two bytes per digit, so
    // chunkSize = 2 * (number of digits in modulus - 1).
    // Since biHighIndex returns the high index, not the number of digits, 1 has
    // already been subtracted.
    this.chunkSize = 2 * biHighIndex(this.m);
    this.radix = 16;
    this.barrett = new BarrettMu(this.m);
    }

    function twoDigit(n)
    {
    return (n < 10 ? "0" : "") + String(n);
    }

    function encryptedString(key, s)
    // Altered by Rob Saunders (rob@robsaunders.net). New routine pads the
    // string after it has been converted to an array. This fixes an
    // incompatibility with Flash MX's ActionScript.
    {
    var a = new Array();
    var sl = s.length;
    var i = 0;
    while (i < sl) {
    a[i] = s.charCodeAt(i);
    i++;
    }

    while (a.length % key.chunkSize != 0) {
    a[i++] = 0;
    }

    var al = a.length;
    var result = "";
    var j, k, block;
    for (i = 0; i < al; i += key.chunkSize) {
    block = new BigInt();
    j = 0;
    for (k = i; k < i + key.chunkSize; ++j) {
    block.digits[j] = a[k++];
    block.digits[j] += a[k++] << 8;
    }
    var crypt = key.barrett.powMod(block, key.e);
    var text = key.radix == 16 ? biToHex(crypt) : biToString(crypt, key.radix);
    result += text + " ";
    }
    return result.substring(0, result.length - 1); // Remove last space.
    }

    function decryptedString(key, s)
    {
    var blocks = s.split(" ");
    var result = "";
    var i, j, block;
    for (i = 0; i < blocks.length; ++i) {
    var bi;
    if (key.radix == 16) {
    bi = biFromHex(blocks[i]);
    }
    else {
    bi = biFromString(blocks[i], key.radix);
    }
    block = key.barrett.powMod(bi, key.d);
    for (j = 0; j <= biHighIndex(block); ++j) {
    result += String.fromCharCode(block.digits[j] & 255,
    block.digits[j] >> 8);
    }
    }
    // Remove trailing null, if any.
    if (result.charCodeAt(result.length - 1) == 0) {
    result = result.substring(0, result.length - 1);
    }
    return result;
    }

    调用方法:

    <script>
    function rsaEncode(text){
    var rsa_n = "1";
    setMaxDigits(131);
    var key=new RSAKeyPair("10001",'',rsa_n);
    var encodeText = encryptedString(key,text);
    return encodeText;
    }
    </script>

  • 相关阅读:
    innodb的innodb_buffer_pool_size和MyISAM的key_buffer_size(转自:http://www.java123.net/898181.html)
    mysql max_allowed_packet参数值改大后,莫名被还原
    windows MySQL5.7.9免安装版配置方法
    centos7.2启动级别
    saltstack
    Jmeter -- 参数化(函数助手和CSV数据文件配置)
    Jmeter -- 上下文关联(JSON提取器)
    LBS 基于位置的服务
    uiautomatorviewer报错 Error taking device screenshot: EOF
    python中加入中文注释报错处理
  • 原文地址:https://www.cnblogs.com/yzryc/p/6025958.html
Copyright © 2020-2023  润新知