RSA Encoder

  1 None.gif // ------------------------------------
  2 None.gif//  RSA Encoder
  3 None.gif//  创建于 2004年10月11日
  4 None.gif//  创建人 luoluo
  5 None.gif//  说明 一个说明RSA原理的简单程序
  6 None.gif//      达不到Encoder的要求,且由于Jscript
  7 None.gif//      的整型精度不够,不适合做RSA加密解密
  8 None.gif//      的程序
  9 None.gif// ------------------------------------
 10 None.gif
 11 None.gif
 12 None.gif // ///
 13 None.gif
 14 None.gif // ------------------------------------
 15 None.gif//  函数名: isNumber
 16 None.gif//  参数: int n
 17 None.gif//  返回值: boolean
 18 None.gif//  作用: 判断变量是否是数字
 19 None.gif// ------------------------------------
 20 ExpandedBlockStart.gifContractedBlock.gif function  isNumber(n)  dot.gif {
 21InBlock.gif    return ! isNaN(n);
 22ExpandedBlockEnd.gif}

 23 None.gif
 24 None.gif
 25 None.gif // ------------------------------------
 26 None.gif//  函数名: isInt
 27 None.gif//  参数: int n
 28 None.gif//  返回值: boolean
 29 None.gif//  作用: 判断变量是否是整数
 30 None.gif// ------------------------------------
 31 ExpandedBlockStart.gifContractedBlock.gif function  isInt(n)  dot.gif {
 32InBlock.gif    if (! isNumber(n))
 33InBlock.gif        throw n + " is not a number";
 34InBlock.gif 
 35InBlock.gif    var re = /\./i;
 36InBlock.gif    return (n.toString().search(re) == -1);
 37ExpandedBlockEnd.gif}

 38 None.gif
 39 None.gif // ------------------------------------
 40 None.gif//  函数名: gcd
 41 None.gif//  参数一: x int
 42 None.gif//  参数二: y int
 43 None.gif//  返回值: int
 44 None.gif//  作用: 求两个数的最大公因数(公约数)
 45 None.gif// ------------------------------------
 46 ExpandedBlockStart.gifContractedBlock.gif function  gcd(x, y)  dot.gif {
 47InBlock.gif    // 验证参数的类型
 48InBlock.gif    if (! isInt(x))
 49InBlock.gif        throw x + " is not a integer";
 50InBlock.gif    if (! isInt(y))
 51InBlock.gif        throw y + " is not a integer";
 52InBlock.gif        
 53InBlock.gif    x = parseInt(x);
 54InBlock.gif    y = parseInt(y);
 55InBlock.gif            
 56InBlock.gif    var ret;    // 存放返回值
 57InBlock.gif    
 58InBlock.gif    // 取参数的绝对值
 59InBlock.gif    if (x < 0
 60InBlock.gif        x = -x;
 61InBlock.gif    if (y < 0)
 62InBlock.gif        y = -y;
 63InBlock.gif        
 64InBlock.gif    // 判断是否为0
 65InBlock.gif    if (! (x + y))
 66InBlock.gif        throw "x and y can't be zero";
 67InBlock.gif    
 68InBlock.gif    // 计算最大公因数
 69InBlock.gif    ret = y;
 70InBlock.gif    
 71ExpandedSubBlockStart.gifContractedSubBlock.gif    while (x > 0dot.gif{
 72InBlock.gif        ret = x;
 73InBlock.gif        x = y % x;
 74InBlock.gif        y = ret;
 75ExpandedSubBlockEnd.gif    }

 76InBlock.gif    
 77InBlock.gif    // 返回
 78InBlock.gif    return ret;
 79ExpandedBlockEnd.gif}

 80 None.gif
 81 None.gif // ------------------------------------
 82 None.gif//  函数名: isEven
 83 None.gif//  参数: int n
 84 None.gif//  返回值: boolean
 85 None.gif//  作用: 判断变量是否是偶数
 86 None.gif// ------------------------------------
 87 ExpandedBlockStart.gifContractedBlock.gif function  isEven(n)  dot.gif {
 88InBlock.gif    if (! isInt(n))
 89InBlock.gif        throw n + " is not a integer";
 90InBlock.gif        
 91InBlock.gif    return (n & 0x01 == 0);
 92ExpandedBlockEnd.gif}

 93 None.gif
 94 None.gif // ------------------------------------
 95 None.gif//  函数名: isEven
 96 None.gif//  参数: int n
 97 None.gif//  返回值: boolean
 98 None.gif//  作用: 判断变量是否是奇数
 99 None.gif// ------------------------------------
100 ExpandedBlockStart.gifContractedBlock.gif function  isOdd(n)  dot.gif {
101InBlock.gif    if (! isInt(n))
102InBlock.gif        throw n + " is not ainteger";
103InBlock.gif        
104InBlock.gif    return (n & 0x01 != 0);
105ExpandedBlockEnd.gif}

106 None.gif
107 None.gif // ------------------------------------
108 None.gif//  函数名: inverse
109 None.gif//  参数: int u
110 None.gif//  参数: int v
111 None.gif//        v * d = 1 (mod u)
112 None.gif//  返回值: int
113 None.gif//  作用: 返回v关于u的乘法逆元素
114 None.gif//  说明: 修改自课本上的程序
115 None.gif// ------------------------------------
116 ExpandedBlockStart.gifContractedBlock.gif function  inverse(u, v)  dot.gif {
117InBlock.gif    if (! isInt(u))
118InBlock.gif        throw u + " is not a integer";
119InBlock.gif    if (! isInt(v))
120InBlock.gif        throw v + " is not a integer";
121InBlock.gif    
122InBlock.gif    u = parseInt(u);
123InBlock.gif    v = parseInt(v);
124InBlock.gif    
125InBlock.gif    var t1, t2, t3;
126InBlock.gif    var u1, u2, u3;
127InBlock.gif    
128InBlock.gif    if (isEven(u) && isEven(v))
129InBlock.gif        return 0;
130InBlock.gif        
131InBlock.gif    u1 = 1;
132InBlock.gif    u2 = 0;
133InBlock.gif    u3 = u;
134InBlock.gif    t1 = v;
135InBlock.gif    t2 = u - 1;
136InBlock.gif    t3 = v;
137InBlock.gif    
138ExpandedSubBlockStart.gifContractedSubBlock.gif    do dot.gif{
139ExpandedSubBlockStart.gifContractedSubBlock.gif        do dot.gif{
140ExpandedSubBlockStart.gifContractedSubBlock.gif            if (isEven(u3)) dot.gif{
141ExpandedSubBlockStart.gifContractedSubBlock.gif                if (isOdd(u1) || isOdd(u2)) dot.gif{
142InBlock.gif                    u1 += v;
143InBlock.gif                    u2 += u;
144ExpandedSubBlockEnd.gif                }

145InBlock.gif                
146InBlock.gif                u1 >>= 1;
147InBlock.gif                u2 >>= 1;
148InBlock.gif                u3 >>= 1;
149ExpandedSubBlockEnd.gif            }

150InBlock.gif            
151ExpandedSubBlockStart.gifContractedSubBlock.gif            if (isEven(t3) || u3 < t3) dot.gif{
152InBlock.gif                u1^=t1, t1^=u1, u1^=t1;
153InBlock.gif                u2^=t2, t2^=u2, u2^=t2;
154InBlock.gif                u3^=t3, t3^=u3, u3^=t3;
155ExpandedSubBlockEnd.gif            }

156ExpandedSubBlockEnd.gif        }
 while (isEven(u3));
157InBlock.gif        
158ExpandedSubBlockStart.gifContractedSubBlock.gif        while ((u1 < t1) || (u2 < t2)) dot.gif{
159InBlock.gif            u1 += v;
160InBlock.gif            u2 += u;
161ExpandedSubBlockEnd.gif        }

162InBlock.gif        
163InBlock.gif        u1 -= t1;
164InBlock.gif        u2 -= t2;
165InBlock.gif        u3 -= t3;
166ExpandedSubBlockEnd.gif    }
 while (t3 > 0);
167InBlock.gif    
168ExpandedSubBlockStart.gifContractedSubBlock.gif    while (u1 > v && u2 >= u) dot.gif{
169InBlock.gif        u1 -= v;
170InBlock.gif        u2 -= u;
171ExpandedSubBlockEnd.gif    }

172InBlock.gif    
173InBlock.gif    return (u - u2);
174ExpandedBlockEnd.gif}

175 None.gif
176 None.gif // ------------------------------------
177 None.gif//  函数名: isPrime
178 None.gif//  参数: int n
179 None.gif//  返回值: boolean
180 None.gif//  作用: 判断变量是否是素数
181 None.gif// ------------------------------------
182 ExpandedBlockStart.gifContractedBlock.gif function  isPrime(n)  dot.gif {
183InBlock.gif    if (! isInt(n))
184InBlock.gif        throw n + " is not a integer";
185InBlock.gif    
186InBlock.gif    var ret = true;    
187InBlock.gif    
188ExpandedSubBlockStart.gifContractedSubBlock.gif    for (var i = 2; i <= n - 1; i ++dot.gif{
189InBlock.gif        if (! (n % i))
190ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
191InBlock.gif            ret = false;
192InBlock.gif            break;
193ExpandedSubBlockEnd.gif        }

194ExpandedSubBlockEnd.gif    }

195InBlock.gif    
196InBlock.gif    return ret;
197ExpandedBlockEnd.gif}

198 None.gif
199 None.gif // ------------------------------------
200 None.gif//  函数名: randomPrime
201 None.gif//  参数: int n
202 None.gif//  返回值: int
203 None.gif//  作用: 产生随机十进制n位素数
204 None.gif// ------------------------------------
205 ExpandedBlockStart.gifContractedBlock.gif function  randomPrime(n)  dot.gif {
206InBlock.gif    var x;
207InBlock.gif    
208ExpandedSubBlockStart.gifContractedSubBlock.gif    do dot.gif{
209InBlock.gif        x = Math.random();
210InBlock.gif        x = parseInt(x * Math.pow(10, n));
211ExpandedSubBlockEnd.gif    }
 while (! isPrime(x) || x.toString().length != n);
212InBlock.gif    
213InBlock.gif    return x;
214ExpandedBlockEnd.gif}

215 None.gif
216 None.gif // ------------------------------------
217 None.gif//  函数名: randomPrimeOfX
218 None.gif//  参数: int n
219 None.gif//  返回值: int
220 None.gif//  作用: 产生随机十进制n位与X互素的数
221 None.gif// ------------------------------------
222 ExpandedBlockStart.gifContractedBlock.gif function  randomPrimeOfX(x, n)  dot.gif {
223InBlock.gif    var y;
224InBlock.gif    
225ExpandedSubBlockStart.gifContractedSubBlock.gif    do dot.gif{
226InBlock.gif        y = Math.random();
227InBlock.gif        y = parseInt(y * Math.pow(10, n));
228ExpandedSubBlockEnd.gif    }
 while (gcd(x, y) != 1 || y.toString().length != n);
229InBlock.gif    
230InBlock.gif    return y;
231ExpandedBlockEnd.gif}

232 None.gif
233 None.gif
234 None.gif // ------------------------------------
235 None.gif//  类名: RSAEncoder
236 None.gif//  作用: RSA加密解密
237 None.gif// ------------------------------------
238 ExpandedBlockStart.gifContractedBlock.gif function  RSAEncoder()  dot.gif {
239InBlock.gif    this.p = randomPrime(2);
240InBlock.gif    this.q = randomPrime(2);
241InBlock.gif    
242InBlock.gif    this.n = 0;
243InBlock.gif    this.e = 0;
244InBlock.gif    this.d = 0;
245InBlock.gif    
246InBlock.gif    this.init = init;
247InBlock.gif    
248InBlock.gif    this.encode = encode;
249InBlock.gif    
250InBlock.gif    this.decode = decode;
251ExpandedBlockEnd.gif}

252 None.gif
253 None.gif // ------------------------------------
254 None.gif//  函数名: init
255 None.gif//  作用: RSAEncoder初始化
256 None.gif// ------------------------------------
257 ExpandedBlockStart.gifContractedBlock.gif function  init()  dot.gif {
258InBlock.gif    this.n = this.p * this.q;
259InBlock.gif    this.e = randomPrimeOfX((this.p - 1* (this.q - 1), 2);
260InBlock.gif    this.d = inverse((this.p - 1* (this.q - 1), this.e);
261ExpandedBlockEnd.gif}

262 None.gif
263 None.gif // ------------------------------------
264 None.gif//  函数名: encode
265 None.gif//  参数: int m
266 None.gif//  返回值: int
267 None.gif//  作用: 加密信息
268 None.gif// ------------------------------------
269 ExpandedBlockStart.gifContractedBlock.gif function  encode(m)  dot.gif {
270InBlock.gif    return (Math.pow(m, this.e) % this.n);
271ExpandedBlockEnd.gif}

272 None.gif
273 None.gif
274 None.gif // ------------------------------------
275 None.gif//  函数名: decode
276 None.gif//  参数: int m
277 None.gif//  返回值: int
278 None.gif//  作用: 解密信息
279 None.gif// ------------------------------------
280 ExpandedBlockStart.gifContractedBlock.gif function  decode(c)  dot.gif {
281InBlock.gif    return (Math.pow(c, this.d) % this.n);
282ExpandedBlockEnd.gif}

283 None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值