RSA简单实现公钥私钥正确为何加密解密后不一致？

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Date;

public class RSA {
private BigInteger p,q,n,d;
private BigInteger e=new BigInteger("65537");
private static BigInteger y;
private static BigInteger x;

``````    private void getPrime(int length){
SecureRandom random=new SecureRandom();
random.setSeed(new Date().getTime());
while((p=BigInteger.probablePrime(length, random)).isProbablePrime(1)==false)
{
continue;
}
while((q=BigInteger.probablePrime(length, random)).isProbablePrime(1)==false)
{
continue;
}
}

public static BigInteger e_gcd(BigInteger a,BigInteger b){
if(b.intValue()==0){
x=new BigInteger("1");
y=new BigInteger("0");
return a;
}
BigInteger ans=e_gcd(b, a.mod(b));
BigInteger tmp=x;
x=y;
y=tmp.subtract(a.divide(b).multiply(y));
``````

// System.out.println("tmp= "+tmp);
// System.out.println("gcd a="+a+" gcd b="+b+" gcd x="+x+" gcd y="+y);
// //System.out.println("gcd y="+y);
//

return ans;
}
BigInteger cald(BigInteger e,BigInteger n){
BigInteger gcd=e_gcd(e, n);
if(BigInteger.ONE.mod(gcd).intValue()!=0)
return new BigInteger("-1");
x.multiply(BigInteger.ONE.divide(gcd));
n=n.abs();
BigInteger ans=x.mod(n);
if(ans.compareTo(BigInteger.ZERO)<0)
return ans;
}

``````    public BigInteger getp(){
return p;
}
public BigInteger getq(){
return q;
}
public BigInteger getn(){
return n;
}
public BigInteger gete(){
return e;
}
public BigInteger getd(){
return d;
}

public RSA(int length){
getPrime(length/2);
n=p.multiply(q);
d=cald(e, n);
//System.out.println("test : "+e.multiply(d).mod(n));
}
public RSA() {
getPrime(128);
n=p.multiply(q);
//d=cald(e, n);
BigInteger tmp=p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));

d=e.modPow(tmp.subtract(BigInteger.ONE),n );
}
public static void main(String[] args) {
// TODO Auto-generated method stub

RSA rsa=new RSA(20);
System.out.println("P= " +rsa.getp());
System.out.println("Q= " +rsa.getq());
System.out.println("E= " +rsa.gete());
System.out.println("N= " +rsa.getn());
System.out.println("D= " +rsa.getd());
BigInteger test=new BigInteger("100");
System.out.println("test:"+rsa.gete().multiply(rsa.getd()).mod(rsa.getn()));
BigInteger testc=test.modPow(rsa.getd(),rsa.getn());
testc=testc.modPow(rsa.gete(),rsa.getn());
boolean flag =testc.equals(test);
System.out.println(flag);

}
``````

}

0

1个回答

1

Rsa 私钥加密 公钥解密

RSA公钥加密私钥解密实例
1、加密、解密流程 2、实现 （1）RSA加密工具类 RSACrypt.java package club.easyshare.framework.utils; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import...

openssl公钥加密私钥解密 &私钥加密公钥解密
// 其他可参考的： 1. http://blog.csdn.net/scape1989/article/details/18959657 2. http://blog.chinaunix.net/uid-23686726-id-3413979.html // 参考：http://hayageek.com/rsa-encryption-decryption-openssl-c/
RSA公钥私钥的简单实现
RSA算法是种能同时用于加密和数字签名的算法，也是被研究得最广泛的公钥算法。而公钥私钥的加密解密也会使一些小伙伴疑惑，这里稍微简单说一下，再简单地实现一下。 首先，公钥加密私钥可以解密。其次，私钥加密公钥可以解密。再深一步来说，公钥负责加密，私钥负责解密。私钥负责签名，公钥负责验证。公钥就是给大家用的，私钥就是给自己用的，必须小心保存。举个栗子，A想向B发送一条加密的信息，使用B的公钥加密，这样
RSA算法公钥私钥加解密C语言源码调试通过
RSA非对称加解密算法，目前主流的加密算法，采用大数库生成大素数，然后根据算法原理，进行大数运算；算法在生成大素数时候相对耗时，但是在加解密的时候速度比较快，目前本算法支持512-2048位的加解密算法，并测试通过，C++版本的也已经上传
java RSA公钥加密，私钥解密算法例子
[size=large][color=red]RSA算法原理[/color][/size] [url]http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html[/url] &quot;非对称加密算法&quot;。 [color=darkblue]　　（1）乙方生成两把密钥（公钥和私钥）。公钥是公开的，任何人都可以获得，私钥则是保密的。 ...

/* * 产生RSA公私钥对 */ public static KeyPair genRSAKeyPair() { KeyPairGenerator rsaKeyGen = null; KeyPair rsaKeyPair = null; try { System.out.println("Generati
RSA私钥加密公钥解密实现（python3）

Java 公钥和私钥加密解密代码
Java 公钥和私钥加密解密源码，写了注释可以直接运行，测试没有问题
RSA加密与解密,SHA1withRSA,生成公钥和私钥
import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.ArrayUtils; import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.KeyPair; import java.se...
php rsa 加密、解密、签名、验签
php对接java rsa 签名、验签、加密、解密
.NET生成RSA公钥和私钥-加密解密示例

RSA加密与解密(Java实现)
RSA的应用 RSA是一种非对称加密算法。现在，很多登陆表单的密码的都采用RSA加密，例如京东中的登陆使用公钥对密码进行加密。 Base64编码 apache.commons-codex包提供了许多编码格式转换，例如Base64。 以下为Base64编码表 使用apache.commons-codex进行Base64对字符串进行编码与解码的程序如下： package com.qian.encod...
RSA加密算法（仅公钥加密，私钥解密）

Android使用RSA加密解密功能的实现
JSEncrypt js RSA加密解密
JS用RSA加密解密技术对密码进行加密解密,再在后台使用对应公钥私钥参数进行解密,提升数据安全 jsencrypt.min.js
Android RSA分段加解密，及私钥生成签名公钥验签
rsa是一种比较普遍的移动端加密方式，公钥用于加密跟验签，私钥用于解密跟生成签名，客户端只需要保存一个公钥即可，私钥用于后台。
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 -变态模式【支持私钥加密，公钥解密】（二）
2019-02-26更新：已上传github RSA变态模式：【私钥加密，公钥解密】 一般这种写法都是JAVA弄的。.NET原生不支持。为啥，我也不清楚，大概是因为安全性问题吧，毕竟公钥是人人都可是持有的。私钥只有自己拥有。 对接注意事项：http://blog.csdn.net/gzy11/article/details/54573973 一般方法请看：http://blog.csdn....
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥、一般模式【支持公钥加密，私钥解密】（一）
2019-02-26日更新：源码更新至github上。 2017-12-04日更新：增加支持微信支付。代码注释中//☆☆☆☆.NET 4.6以后特有☆☆☆☆的别用，那个不对。 RSA非对称加密。简明扼要吧，直说干货。（在此特别感谢下貳进制，提供JAVA版的公钥私钥） C#RSA加签解签加密比较常见，一般遇到的问题是非.NET代码的加签验签、加密解密。以下就是解决此类问题的。 一般情况下是【...
java实现RSA+AES的简单加密解密
TestAesAndRsapackage com.zhuyun.test; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.SecretKey; import org.junit.Test; import co
delphi (RSA公钥加密，私钥解密)、(RSA私钥加密，公钥解密)、MD5加密、SHA加密

java 实现RSA实现数据的私钥加密以及公钥解密
1.第一个类KeyGenerate.java生成RSA公钥与私钥并保存到文件中 package signature; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.security.Key
Nodejs crypto模块公钥加密私钥解密探索
１．什么是公钥加密私钥解密 简单一点来说一般加密解密都用的是同一个秘钥或者根本不用，而这里采用的是加密用一个秘钥，解密用另一个秘钥且能解密成功．这就属于不对称加密解密算法的一种了． ２．公钥秘钥的生成 由于这种加密方案，公钥秘钥是成对的，所以需要一些工具生成 利用　openssl　生成公钥私钥 生成公钥： openssl genrsa -out rsa_private_key....
WAS支持RSA公钥解密

RSA使用前台公钥加密后台私钥解密实例

Golang代码搜集-基于RSA的公钥加密私钥解密-私钥签名公钥验证

RSA密钥生成、加密解密、数据签名验签

RSA加解密工具类

C# RSA2048 公钥加密，私钥解密

【Delphi】 (RSA公钥加密，私钥解密)、(RSA私钥加密，公钥解密)、MD5加密、SHA加密
【Delphi】支持 (RSA公钥加密，私钥解密)、(RSA私钥加密，公钥解密)、MD5加密、SHA1加密、SHA224加密、SHA256加密、SHA384加密、SHA512加密

RSA算法计算工具，方便计算公钥、私钥
RSA工具，很经典的软件，RSA算法计算工具，方便计算公钥、私钥
RSA公钥私钥的生成及其加密解密过程详解(公司级别质数,原理一样)

RSA加密算法详解以及RSA在laravel中的应用