证券rsa签名rsa密钥在线生成是什么

用实例给新手讲解RSA加密算法
日14:04  来源:
图为 RSA公开密钥算法的发明人,从左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片摄于1978年
   RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。   RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。  RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。   RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:  可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到:一、 什么是“素数”?  素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。二、什么是“互质数”(或“互素数”)?  小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。  判别方法主要有以下几种(不限于此):(1)两个质数一定是互质数。例如,2与7、13与19。(2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与 26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如 15与 16。(5)相邻的两个奇数是互质数。如 49与 51。(6)大数是质数的两个数是互质数。如97与88。(7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7和 16。(8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。三、什么是模指数运算?   指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。   模指数运算就是先做指数运算,取其结果再做模运算。如  好,现在开始正式讲解RSA加密算法。算法描述:(1)选择一对不同的、足够大的素数p,q。(2)计算n=pq。(3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。(4)找一个与f(n)互质的数e,且1&e&f(n)。(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。(6)公钥KU=(e,n),私钥KR=(d,n)。(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:。(8)解密过程为:。 实例描述:  在这篇科普小文章里,不可能对RSA算法的正确性作严格的数学证明,但我们可以通过一个简单的例子来理解RSA的工作原理。为了便于计算。在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:(1)设计公私密钥(e,n)和(d,n)。令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3与20互质)则e×d≡1 mod f(n),即3×d≡1 mod 20。d怎样取值呢?可以用试算的办法来寻找。试算结果见下表:  通过试算我们找到,当d=7时,e×d≡1 mod f(n)同余等式成立。因此,可令d=7。从而我们可以设计出一对公私密钥,加密密钥(公钥)为:KU =(e,n)=(3,33),解密密钥(私钥)为:KR =(d,n)=(7,33)。(2)英文数字化。  将明文信息数字化,并将每块两个数字分组。假定明文英文字母编码表为按字母顺序排列数值,即:  则得到分组后的key的明文信息为:11,05,25。(3)明文加密   用户加密密钥(3,33) 将数字化明文分组信息加密成密文。由C≡Me(mod n)得:  因此,得到相应的密文信息为:11,31,16。(4)密文解密。  用户B收到密文,若将其解密,只需要计算,即:  用户B得到明文信息为:11,05,25。根据上面的编码表将其转换为英文,我们又得到了恢复后的原文“key”。    你看,它的原理就可以这么简单地解释!   当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。最后简单谈谈RSA的安全性   首先,我们来探讨为什么RSA密码难于破解?    在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破解密文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)和(q-1)。换句话说,只要求出p和q的值,我们就能求出d的值而得到私钥。   当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。因此,RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。  然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。  此外,RSA的缺点还有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。
【来源:】
(责任编辑:和讯投资)
06/23 04:2405/26 04:3404/01 04:0803/13 07:49
感谢您的参与!查看[]
script src="/track/track_xfh.js?ver=">使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的服务器异步通知 - 星空漫野
- 博客频道 - CSDN.NET
5270人阅读
由于业务需要,我们需要使用支付宝移动快捷支付做收款。支付宝给了我们《移动快捷支付应用集成接入包支付接口》见支付宝包《WS_SECURE_PAY_SDK》。
支付宝给的服务器demo只有Java、C#、PHP三种,而我们服务器端使用的是C++。这其中就涉及到接收支付宝的服务器异步通知。为了确保接收到的服务器异步通知来至支付宝,我们就必须验证支付宝的签名。坑爹的是,原来PC端使用MD5做签名,估计支付宝考虑到移动端的风险更高,于是改用RSA做移动快捷支付应用的签名。这无疑增加了我们迁移到移动端的开发成本。
支付宝文档中说明是使用openssl,我们这边就决定使用openssl做rsa签名验证。
由于第一次使用openssl做RSA验证签名,我们碰到了各种坑,为了避免其他项目也碰到类似问题,分享如下:
首先要说明的是RSA签名和签名验证的过程。
RSA签名的过程(支付宝操作)如下:对需要签名的字符串按key的字母升序排序,使用=和&连接,形成一个签名字符串。对该字符串做摘要(可以使用MD5或者SHA1,支付宝使用的是SHA1),然后对摘要字符串(即接口中的hash参数)使用支付宝私钥做RSA加密,获得加密字符串,即为签名字符串(放在sign中),设置sign_type=RSA。这样,就完成了发送字符串的签名。
RSA签名验证的过程(我们第三方企业操作)如下:接收到发送过来的字符串(如果字符串没有做url decode解码,需要做url decode解码),拆分为key、value对,按照支付宝的文档,根据key的字母升序排序,使用=和&链接,获得被签名字符串。被签名字符串做SHA1摘要算法,获得SHA1摘要字符串。如果sign_type=RSA,先将sign字段做base64解码,然后使用支付宝公钥做RSA解密,得到SHA1摘要字符串。比较两个SHA1摘要字符串,如果SHA1摘要字符串一致,则签名验证成功。
特别说明的是:支付宝的公钥字符串为以-----BEGIN PUBLIC KEY-----\n开始,以\n-----END PUBLIC KEY-----\n结束,中间的字符串需要每64个字符换行一次,即为:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRA
FljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQE
B/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5Ksi
NG9zpgmLCUYuLkxpLQIDAQAB
-----END PUBLIC KEY-----
理论说完了,再解释一下使用的函数吧。
验证签名函数为:int verifyAlipayNotify(const std::string& recvString, const std::string& alipayPublicKey);
recvString为接收的字符串,未做urldecode。
alipayPublicKey为本地内存中存储的支付宝公钥,已经保证包含特殊说明的条件。
使用的openssl函数如下:
int RSA_verify(int type, const unsigned char *m, unsigned int m_length,
&& &const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
type 使用何种摘要算法,这里由于使用的是SHA1算法,填写NID_sha1
m 摘要字符串
m_length 摘要字符串长度
sigbuf 支付宝返回的签名,已经做了base64解码
siglen 支付宝返回的签名长度,这里应该为128
rsa openssl的RSA密钥结构体,这里由支付宝公钥转化而来的
返回值:负数为执行错误,0为签名验证失败(估计是有黑客攻击你),1为签名验证成功
verifyAlipayNotify代码如下:
#include &openssl/rsa.h&
#include &openssl/sha.h&
#include &openssl/md5.h&
#include &openssl/rand.h&
#include &openssl/objects.h&
#include &openssl/pem.h&
#include &openssl/bio.h&
#include &string&
#include &map&
#include &urlcodec.h&
#include &base64.h&
struct ltstr
bool operator()(std::string s1, std::string s2) const{return (s1.compare(s2) & 0);}
int verifyString(const std::string& signString, const std::string& sign, const std::string& alipayPublicKey)
//获得支付宝的签名字节串
char szSign[128];
unsigned long szSignLen = 128;
bool decodeResult = CBase64::Decode(sign, (unsigned char*)szSign, &szSignLen);//CBase::Decode是Base64解码函数,您可以在网上随便下载一个
if(!decodeResult)
return -1;
//获得SHA1摘要字符串
unsigned char sha1Origin[20];
SHA1((unsigned char*)signString.c_str(), signString.size(), sha1Origin);
//由支付宝公钥内存字符串转化为openssl的RSA结构
BIO* memBIO = NULL;
memBIO = BIO_new(BIO_s_mem());
int bioWriteLen = BIO_write(memBIO, alipayPublicKey.c_str(), alipayPublicKey.length());
RSA* rsa = PEM_read_bio_RSA_PUBKEY(memBIO, NULL, NULL, NULL);
    if(NULL == rsa)
    {
        return -2;
    }
//签名验证
int verifyResult = RSA_verify(NID_sha1, sha1Origin, SHA_DIGEST_LENGTH, (unsigned char*)szSign, szSignLen, rsa);
return verifyR
int verifyAlipayNotify(const std::string& alipayNotifyData, const std::string& alipayPublicKey)
std::string strAlipayNotifyData = alipayNotifyD
std::map&std::string, std::string, ltstr&
std::string::size_type pos = strAlipayNotifyData.find(&&&);
while(std::string::npos != pos)
std::string one = strAlipayNotifyData.substr(0, pos);
std::string::size_type subpos = one.find(&=&);
if(std::string::npos != subpos)
std::string key = one.substr(0, subpos);
if(&sign_type& != key && &sign& != key)
std::string value = one.substr(subpos+1);
std::string newValue = UrlDecode(value);//UrlDecode是URL解码函数,您可以在网上随便下载一个
omap.insert(std::make_pair(key, newValue));
else if(&sign& == key)
sign = UrlDecode(one.substr(subpos+1));
strAlipayNotifyData = strAlipayNotifyData.substr(pos + 1);
pos = strAlipayNotifyData.find(&&&);
std::string::size_type subpos = strAlipayNotifyData.find(&=&);
if(std::string::npos != subpos)
std::string key = strAlipayNotifyData.substr(0, subpos);
if(&sign_type& != key && &sign& != key)
std::string value = strAlipayNotifyData.substr(subpos+1);
std::string newValue = UrlDecode(value);
omap.insert(std::make_pair(key, newValue));
else if(&sign& == key)
sign = UrlDecode(strAlipayNotifyData.substr(subpos+1));
//获得支付宝被签名字符串
std::string signString = &&;
std::map&std::string, std::string, ltstr&::iterator itr = omap.begin();
for(; itr != omap.end(); ++itr)
signString += itr-&
signString += &=&;
signString += itr-&
signString += &&&;
if(!signString.empty())
signString.erase(signString.length() - 1);
return verifyString(signString, sign, alipayPublicKey);
有时候,你本地存储的公钥是没有包含头尾的,如
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB
为此,提供一个函数支持转化为完整公钥的函数:
std::string completeAlipayPublicKey(std::string strPublicKey)
int nPublicKeyLen = strPublicKey.size();
//strPublicKey为base64编码的公钥字符串
for(int i = 64; i & nPublicKeyL i+=64)
if(strPublicKey[i] != '\n')
strPublicKey.insert(i, &\n&);
strPublicKey.insert(0, &-----BEGIN PUBLIC KEY-----\n&);
strPublicKey.append(&\n-----END PUBLIC KEY-----\n&);
return strPublicK
最后,测试代码如下:int main(int argc, char **argv)
std::string strPublicKey = &**********&;
std::string strAlipayData = &**********&;
std::string strCompletePublicKey = completeAlipayPublicKey(strPublicKey);
int result = verifyAlipayNotify(strAlipayData, strCompletePublicKey);
if(1 == result)
printf(&verify sign ok!\n&);
else if(0 == result)
printf(&mock alipay notify data&);
printf(&error\n&);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:136509次
积分:1791
积分:1791
排名:第10947名
原创:46篇
评论:69条
(1)(1)(1)(1)(1)(1)(1)(1)(3)(1)(1)(1)(2)(4)(7)(3)(3)(7)(2)(4)信息安全第一次作业,AES CBC加密,RSA密钥签名 - Yelbosh的专栏
- 博客频道 - CSDN.NET
package com.yelbosh.
import it.sauronsoftware.base64.Base64;
import javax.crypto.C
import javax.crypto.spec.IvParameterS
import javax.crypto.spec.SecretKeyS
public class AESOperator {
* 加密用的Key 可以用26个字母和数字组成
* 此处使用AES-128-CBC加密模式,key需要为16位。
private String sKey=&abcdef&;
private String ivParameter=&abcdef&;
private static AESOperator instance=
private AESOperator(){
public static AESOperator getInstance(){
if (instance == null)
instance = &new AESOperator();
public String encrypt(String sSrc) throws Exception {
Cipher cipher = Cipher.getInstance(&AES/CBC/PKCS5Padding&);
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, &AES&);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(&utf-8&));
return new String(Base64.encode(encrypted));//此处使用BASE64做转码。
public String decrypt(String sSrc) throws Exception {
byte[] raw = sKey.getBytes(&ASCII&);
SecretKeySpec skeySpec = new SecretKeySpec(raw, &AES&);
Cipher cipher = Cipher.getInstance(&AES/CBC/PKCS5Padding&);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = Base64.decode(sSrc.getBytes());//先用base64解密
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original,&utf-8&);
return originalS
} catch (Exception ex) {
package com.yelbosh.
import it.sauronsoftware.base64.Base64;
import java.security.KeyP
import java.security.PrivateK
import java.security.PublicK
import java.security.SecureR
public class KeyGenerater {
private byte[] priK
private byte[] pubK
public void generater() {
java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
.getInstance(&RSA&);
SecureRandom secrand = new SecureRandom();
secrand.setSeed(&syj&.getBytes()); // 初始化随机产生器
keygen.initialize(1024, secrand);
KeyPair keys = keygen.genKeyPair();
PublicKey pubkey = keys.getPublic();
PrivateKey prikey = keys.getPrivate();
pubKey = Base64.encode(pubkey.getEncoded());
priKey = Base64.encode(prikey.getEncoded());
System.out.println(&成功生成密钥!&);
System.out.println(&pubKey = & + new String(pubKey));
System.out.println(&priKey = & + new String(priKey));
} catch (java.lang.Exception e) {
System.out.println(&生成密钥对失败&);
e.printStackTrace();
public byte[] getPriKey() {
return priK
public byte[] getPubKey() {
return pubK
package com.yelbosh.
import it.sauronsoftware.base64.Base64;
import java.security.KeyF
import java.security.PrivateK
import java.security.spec.PKCS8EncodedKeyS
public class Signaturer {
//使用私钥和明文生成发送者对该文件的签名
public static byte[] sign(byte[] priKeyText, String plainText,boolean md5) {
&PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64
&.decode(priKeyText));
&KeyFactory keyf = KeyFactory.getInstance(&RSA&);
&PrivateKey prikey = keyf.generatePrivate(priPKCS8);
&// 用私钥对信息生成数字签名
&java.security.Signature signet =
&signet = java.security.Signature
&.getInstance(&MD5withRSA&);
&signet = java.security.Signature
&.getInstance(&SHA512withRSA&);
&signet.initSign(prikey);
&signet.update(plainText.getBytes());
&byte[] signed = Base64.encode(signet.sign());
&} catch (java.lang.Exception e) {
&System.out.println(&签名失败&);
&e.printStackTrace();
package com.yelbosh.
import it.sauronsoftware.base64.Base64;
public class SignProvider {
//使用公钥,明文,签名来验证签名是否合法
public static boolean verify(byte[] pubKeyText, String plainText,
& byte[] signText,boolean md5) {
& // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
& java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
& & Base64.decode(pubKeyText));
& // RSA对称加密算法
& java.security.KeyFactory keyFactory = java.security.KeyFactory
& & .getInstance(&RSA&);
& // 取公钥匙对象
& java.security.PublicKey pubKey = keyFactory
& & .generatePublic(bobPubKeySpec);
& // 解密由base64编码的数字签名
& byte[] signed = Base64.decode(signText);
& java.security.Signature signatureChecker =
& signatureChecker = java.security.Signature
& .getInstance(&MD5withRSA&);
& signatureChecker = java.security.Signature
& & .getInstance(&SHA512withRSA&);
& signatureChecker.initVerify(pubKey);
& signatureChecker.update(plainText.getBytes());
& // 验证签名是否正常
& if (signatureChecker.verify(signed))
&} catch (Throwable e) {
& System.out.println(&校验签名失败&);
& e.printStackTrace();
package com.yelbosh.
import java.io.F
import java.io.FileNotFoundE
import java.io.FileR
import java.io.FileW
import java.io.IOE
import java.util.S
public class Main {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
System.out.println(&请输入您要加密的文件的路径:\n&);
Scanner scanner = new Scanner(System.in);
String fpath = scanner.next();
File file = new File(fpath);
FileReader fReader = new FileReader(file);
char[] tmp = new char[(int) file.length()];
fReader.read(tmp);
//读取的明文!!!!!!!!!!!
String content = new String(tmp);
//System.out.println(content);
System.out.println(&文件读取中……&);
Thread.currentThread().sleep(500);
System.out.println(&文件读取完毕!&);
Thread.currentThread().sleep(500);
System.out.println(&按任意键对文件进行AES的CBC模式加密:\n&);
scanner.next();
AESOperator aesoptr = AESOperator.getInstance();
long lStart = System.currentTimeMillis();
String step1Str = aesoptr.encrypt(content);
long lUseTime = System.currentTimeMillis() - lS
//System.out.println(step1Str);
System.out.println(&加密完成!耗时:& + lUseTime+&ms&);
FileWriter fWriter = new FileWriter(&./step1.txt&);
fWriter.write(step1Str);
fWriter.flush();
fWriter.close();
Thread.currentThread().sleep(500);
System.out.println(&密文成功写入当前目录下step1.txt文件中!&);
Thread.currentThread().sleep(500);
System.out.println(&按任意键对密文进行公钥签名:\n&);
scanner.next();
System.out.println(&选择hash算法:&);
System.out.println(&1.MD5\n2.SHA512&);
boolean md5 = (scanner.nextInt()==1?true:false);
KeyGenerater keyGen = new KeyGenerater();
keyGen.generater();
fWriter = new FileWriter(&./step2PubKey.txt&);
fWriter.write(new String(keyGen.getPubKey()));
fWriter.flush();
fWriter.close();
System.out.println(&公钥成功写入当前目录下step2PubKey.txt文件中!&);
Thread.currentThread().sleep(500);
fWriter = new FileWriter(&./step2PriKey.txt&);
fWriter.write(new String(keyGen.getPriKey()));
fWriter.flush();
fWriter.close();
System.out.println(&私钥成功写入当前目录下step2PriKey.txt文件中!&);
Thread.currentThread().sleep(500);
System.out.println(&按任意键对密文生成签名:\n&);
scanner.next();
byte[] sig = Signaturer.sign(keyGen.getPriKey(), step1Str, md5);
Thread.currentThread().sleep(500);
fWriter = new FileWriter(&./step2Sig.txt&);
fWriter.write(new String(sig));
fWriter.flush();
fWriter.close();
System.out.println(&签名成功!成功写入当前目录下step2Sig.txt文件中!&);
Thread.currentThread().sleep(1000);
System.out.println(&让我们来验证与解密一下吧!&);
Thread.currentThread().sleep(500);
System.out.println(&签名验证中……&);
Thread.currentThread().sleep(500);
if(SignProvider.verify(keyGen.getPubKey(), step1Str, sig, md5))
System.out.println(&验证通过!&);
Thread.currentThread().sleep(500);
System.out.println(&解密中……&);
Thread.currentThread().sleep(500);
long lStart2 = System.currentTimeMillis();
String step3Str = aesoptr.decrypt(step1Str);
long lUseTime2 = System.currentTimeMillis() - lStart2;
//System.out.println(step1Str);
System.out.println(&解密完成!耗时:& + lUseTime2+&ms&);
System.out.println(&明文为:&+step3Str);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:489767次
积分:6905
积分:6905
排名:第1310名
原创:200篇
转载:242篇
评论:76条}

我要回帖

更多关于 rsa密钥长度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信