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 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
随机推荐
- 常用HTTP状态码和CURL 000问题
最近在测试CDN服务质量问题,测试过程中返回了一些不同的状态码,当然有一些常用的,也有一些不常用的.最奇葩的是在使用curl命令的时候出现000状态码,问了很多同事,对这个000的反应跟新事物是的 ...
- vim + ctags + taglist配置和使用
vim +ctags + taglist ,ctags+cscope 安装配置和使用 内容:VIM下ctags和taglist的安装配置方法:一键安装 ctags和cscope的方法 :vim语法高亮 ...
- 3. web前端开发分享-css,js提高篇
一. css基础知识掌握之后(个人的标准是:弄清块元素与内联元素的区别,弄清float的应用场景,弄清position[pə'zɪʃən] 下五个属性static['stætɪk],relative[ ...
- Oracle 查询语句(where,order by ,like,in,distinct)
select * from production;alter table production add productionprice number(7,2); UPDATE production s ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- Hibernate之lazy延迟加载
一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...
- dom解析和sax解析的区别及优缺点
dom解析一开始就将文档所有内容装入内存,每个元素(标签)都作为一个element对象存储,形成对象树,缺点是对内存占用大,不能解析数据量很大的文档:优点是方便进行crud操作. sax解析,逐行解析 ...
- 提升PHP编程效率的20个要素
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(兄弟连PHP编程: ...
- Qt &QSS
Today task:解决了qt中的一些控件无法使用qss的问题(如QProgressDialog 调节chunk的颜色,QMessageBox按钮的颜色问题)1,对于QMessageBox,可以单独 ...
- doT.js
最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io 下面是用法: 模板引 ...