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 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
随机推荐
- MediaElement 的两种模式
MediaElement 是一个 UIElement,它受 布局系统 支持并可用作许多控件的内容.它也可用在可扩展应用程序标记语言 (XAML) 以及代码中.另一方面,MediaPlayer 用于 D ...
- ITShare
框架底层通过IBatis和XML实现ORM映射: 业务处理类似UI,通过Controller和JavaScript交互: 视图通过Castle与NVelocity实现,jquery.tmpl渲染: . ...
- p/invoke 碎片-- 对字符串的处理
字符串在内存中的的几种风格 字符串作为参数和返回值 参考 字符串在内存中的几种风格 所谓的风格,也就是字符串在内存中的存在形式.如何存放的,占据内存的大小,还有存放顺序等.在不同的编程语言和不同的平台 ...
- 百度编辑器ueditor插入表格没有边框颜色的解决方法
附:从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细: http://blog.csdn.net/lovelyelfpop/article/details/51678 ...
- C#操作mysql数据库
转 http://www.jb51.net/article/43486.htm using System;using System.Configuration;using MySql.Data.My ...
- 微信小程序常见问题集合(长期更新)
最新更新: 新手跳坑系列:推荐阅读:<二十四>request:fail错误(含https解决方案)(真机预览问题 跳坑指南<七十>如何让微信小程序服务类目审核通过 跳坑六十九: ...
- PHP基础
$a=10; //$b="hello";//$a=(string)$a; 强制转换A的类型为字符串 //settype($a,"string");//var_d ...
- C语言 活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...
- Tomcat的设定
tomcat 版本 apache-tomcat-7.0.68-windows-x64 1.解压文件到 eclipse文件夹中,这个放哪都可以,个人习惯而已 2.tomcat目录结构 图片为盗图- 3 ...
- Windows 网络通讯开发
Windows 网络通讯开发 一.Windows网络开发API 由于C++标准库中没有网络库,所以进行网络开发的时候要调用系统API.Windows通讯开发API包括以下几个基本函数及成员类型: 1. ...