rsa加密demo

选择一对不同的、足够大的素数p,q。

计算n=pq。

计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。

找一个与f(n)互质的数e,且1<e<f(n)。

计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡ e-1 mod f(n)
这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。

公钥KU=(e,n),私钥KR=(d,n)。

加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:C ≡ M^e mod n。

解密过程为:M ≡ C^d mod n。

摘自http://bank.hexun.com/2009-06-24/118958531.html

n = 33 = p * q = 3 * 11
t = (p - 1) * (q - 1) = 2 * 10 = 20
e = 3

var e = 3, t = 20, d;
for(d = 3; d && d < 10000; d++){ //为了避免死循环,加上d<10000
    if(d * e % t == 1){
        console.log('d=%d',d);
        break;
    }
}

// d = 7
// 
// n = 33
// d = 7
// e = 3
// 
// C = M ^ d % n
// M = C ^ e % n

function rsa(a, k, m) {  // a^k%m 摘自 http://wenku.baidu.com/view/27cea13743323968011c923b.html
    var b = 1;
    while (k >= 1) {
        if (k % 2 == 1){
            b = a * b % m;
        }
        a = a * a % m;
        k = parseInt(k / 2);
    }
    return b;
}

http://www.ohdave.com/rsa/

posted @ 2013-04-16 18:04  Arliang  阅读(791)  评论(0编辑  收藏  举报