RSA算法学习
package com.test.rsa; /*
* 为了选择公钥和私钥,Bob必须执行如下步骤:
* 1)选择两个大素数p和q.那么p和q应该多大呢?该值越大,RSA越难于破解,但是执行加密和解密所用的时间也越长。RSA实验室推
* 荐,公司使用时,p和q的乘积为1024比特的数量级,对于"价值不太高的信息",p和q的乘积应为768比特的数量级[RSA Key 2007]
* (这导致人们想知道为什么在公司的使用被认为比在其他场合下的使用重要得多!).对于选择大素数的方法的讨论参见[Caldwell 2007]
* 2)计算n=pq和z=(p-1)(q-1)
* 3)选择小于n的一个数e,且使e和z没有(非1的)公因数(这时称e与z互素).使用字母e表示这个数是因为这个值将用于加密.
* 4)找到一个数d,使得ed-1可以被z整除(就是说,没有余数).使用字母d表示这个数是因为这个值将被用于解密.换句话说,给定e,
* 然后选择d使得ed被z除的整数余数为1.(当整数x被整数n除时,整数余数表示为x mod n.)
* 5)Bob对外公布的公钥就是二元组(n,e);其私钥就是二元组(n,d).
*
*
* 假设Bob想给Alice送一个消息m,他知道Alice产生的n和e。他使用起先与Alice约好的格式将m转换为一个小于n的整数num,
* 比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,
* 他可以将这个信息分为几段,然后将每一段转换为num。用下面这个公式他可以将num加密为c:
* num^e ≡ c (mod n)
* 计算c并不复杂。Bob算出c后就可以将它传递给Alice。
*
*/ /**
* @author shalltear@shalltear.com
* RSA 简单实现学习
*/
public class Main { public static void main(String[] args) {
int p = 2;
int q = 11;
int n = p*q;
int z = (p-1)*(q-1);
int e = 3; Main main =new Main();
int d = main.getd(e, z); System.out.println("n: "+n);
System.out.println("*****");
int enc = main.encrypt(20, e, n);
System.out.println("*****");
main.decrypt(enc, d, n); }
/**
计算e对于z的模反元素d,所谓"模反元素"就是指有一个整数d,可以使得 ed 被φ(n)除的余数为1。
ed ≡ 1 (mod φ(n)) 这个式子等价于 ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
ed + zk = 1
已知 e=5, φ(n)=96,
5d + 96k = 1
这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。
*/
public int getd(int e,int z) {
//实际上即使需要找到一个整数d满足 ed-1=kz -> d= (kz+1)/e,其中k当然也是整数
/*
int k=1;
Object object = (k*z+1)/e;
while(!(object instanceof Integer)) {
k++;
}
System.out.println("d: "+object.toString());
return Integer.parseInt(object.toString());
*/
int k=1;
while(true) {
if((k*z+1)%e==0) {
System.out.print("k: "+k+" ");
System.out.print("z: "+z+" ");
System.out.print("e: "+e+" ");
System.out.println("d: "+(k*z+1)/e);
return (k*z+1)/e;
}
k++;
}
} /**
* 加密函数 输入明文num,密钥(e,n),输出密文c,c满足 num^e ≡ c (mod n)
* @param msg 待加密信息
* @param e 密钥
* @param n 密钥
* @return 密文
*/
public int encrypt(int num,int e,int n) {
System.out.println("待加密数字: "+num);
System.out.println("加密后数字: "+(int)(Math.pow(num, e)%n));
return (int)(Math.pow(num, e)%n);
}
/**
* 解密函数 输入密文num,密钥(d,n),输出明文msg,msg满足 num^d ≡ msg (mod n)
* @param num 密文
* @param d 密钥
* @param n 密钥
* @return 明文
*/
public int decrypt(int num,int d,int n) {
System.out.println("待解密数字: "+num);
System.out.println("解密后数字: "+(int)(Math.pow(num, d)%n));
return (int)(Math.pow(num, d)%n);
}
} 运行结果:
k: 2 z: 10 e: 3 d: 7
n: 22
*****
待加密数字: 20
加密后数字: 14
*****
待解密数字: 14
解密后数字: 20
2016.04.03
– 此前一直得到错误的运行结果,后来才知道被加密的整数是必须要小于n的。至于为什么,等明白了再回来补。
– 整理:
密文 c = m^e mod n (1)
明文 m = c^d mod n (2)
(2)式是可以根据(1)式进行证明的。
RSA算法学习的更多相关文章
- RSA算法、SSL协议学习笔记
最近学习计算机网络,涉及到SSL协议,我想起了去年密码学课程讲过的非对称加密RSA算法,结合阮老师的博客,写写学习笔记,这里再回忆一下. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指 ...
- RSA算法之学习
一.RSA算法 RSA是非对称加密算法中的代表,它的重要性不言而喻,为了弄清楚RSA算法,我们一起来完成一项任务: 背景:现在是疫情时代,假如小明和女朋友被迫在两个城市,小明为了表达感情,想发给对方一 ...
- 跨越千年的RSA算法
转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
- RSA算法小记
学习来源:http://www.cnblogs.com/vamei/p/3480994.html 小记: 一.数学基础: 欧拉Phi函数:Φ(n)=总数(从1到n-1中与n互质的整数) (1)欧拉定理 ...
- SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)
SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...
- 非对称加密技术- RSA算法数学原理分析
非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...
- 更多细节的理解RSA算法
一.概述 RSA算法是1977年由Ron Rivest.Adi Shamir 和 Leonard Adleman三人组在论文A Method for Obtaining Digital Signatu ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- [转载]RSA算法详解
原文:http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
随机推荐
- python api
import requests #查询手机好归属地API def phone(tel): url = 'http://op.juhe.cn/onebox/phone/query' appkey = ' ...
- 高性能异步图片加载器的JS库:lazysizes
<script src="lazysizes.min.js" async=""></script> 使用示例 <!-- non-r ...
- todo
ID生成器要做成兼容分布式, 数据库ef控制要改成手动升级, 异常日志模块,操作日志某快,,, 日志服务器,, 图片服务器,,,动静分离, 前后台分离,, 可扩展性,无状态化集群弹性部署, 数据库主 ...
- MySQL主从复制实现
上回提到了用ThinkPHP框架来实现数据库的读写分离,现在就来简单说说MySQL的主从复制. 形式 一主一从(也就是这里要实现的形式) 主主复制 一主多从 多主一从(MySQL5.7开始支持) 联级 ...
- 关于java中自增,自减,和拓展运算符的小讨论
java中运算符很多,但是能深入讨论的不算太多.这里我仅仅以++,*=为例做讨论. 例:++ i=0; i=i++ + ++i;//i=1 i=++i+i++;//i=2 i=i++ -++i;//i ...
- AngularJS2.0 教程系列(一)
http://my.oschina.net/u/2275217/blog/482178
- <c ss高效开发实战>看完了,Bootstrap学习是关键
Bootstrap果真给我们带来了很多便利,学习CSS,必须要掌握很多框架和快速学习的方法. 这本书看完了,也写过几篇读书笔记,墙裂推荐.不上书封面了,只上书的导图. 这里说几点学习CSS的心得 1. ...
- markdown语法与使用
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 语法 # 文本 =>h1标签 ##文本 =>h2标签 *文本* =&g ...
- SQL分页获取数据
SQL Server分页 select * from (') t Oracle分页 SELECT * FROM (' ORDER BY MaterialNM) t
- webstorm ES6 转 ES5
一句话总结:用WebStorm自带的File Watcher功能+Babel实现自动转换ECMAScript 6代码为ES5代码 1. 新建一个Empty Project,然后在src目录下新建了一个 ...