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 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
随机推荐
- CSS样式表
CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;" ...
- Access-Control-Allow-Origin与跨域问题
在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在response中添加 Access-Control-Allow-Origin 的header,才能让前者成功拿到数 ...
- [Android]学习笔记之布局
5大布局,其中前3个是常用的,第四个绝对布局已经提示deprecated ![](http://images2015.cnblogs.com/blog/194303/201611/194303-201 ...
- Bubble Cup 8 finals I. Robots protection (575I)
题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<= ...
- Git 分支管理和冲突解决
Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...
- Android常用组件之ListView
使用ListAdapter是ListView的适配器. 使用ListView.setAdapter()方法来设置ListView的适配器. 简单的使用 adapter = new ArrayAdapt ...
- Linux下Python 文件内容替换脚本
Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...
- HTML CSS 特殊字符表(转载)
转载地址:http://blog.csdn.net/bluestarf/article/details/40652011 转载原文地址:http://zhengmifan.com/news/noteb ...
- python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))
报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...
- ProgressBar---进度条
最近在处理标题进度条时,耗费了一些时间,现在总结一下ProgressBar的相关知识,有不对的地方请大神们批评指正! 进度条主要有以下三种: 1.对话框进度条 2.标题进度条 注意:requestWi ...