RSA加密解密及数字签名Java实现--转
<td class="number">
01
</td><td class="content">
<code class="keyword">import?<code class="plain">java.security.MessageDigest;
</td>
</tr>
</table>
</tr></table>
04
?
</tr></table>
05
</tr></table>
?
</tr></table>
07
?</tr></table>
08
???
</tr></table>
09
???
</tr></table>
10
?</tr></table>
11
</tr></table>
12
</tr></table>
13
</tr></table>
14
</tr></table>
15
</tr></table>
16
</tr></table>
17
???
</tr></table>
18
??
</tr></table>
19
</tr></table>
20
?</tr></table>
21
</tr></table>
22
</tr></table>
23
</tr></table>
24
</tr></table>
25
</tr></table>
26
</tr></table>
27
???
</tr></table>
28
??
</tr></table>
29
</tr></table>
30
?</tr></table>
31
</tr></table>
32
</tr></table>
33
</tr></table>
34
</tr></table>
35
</tr></table>
36
</tr></table>
37
???
</tr></table>
38
</tr></table>
39
</tr></table>
40
?
</tr></table>
41
</tr></table>
42
?</tr></table>
43
</tr></table>
44
</tr></table>
45
</tr></table>
46
</tr></table>
47
</tr></table>
48
</tr></table>
49
???
</tr></table>
50
</tr></table>
51
</tr></table>
52
?
</tr></table>
53
</tr></table>
54
</tr></table>
?????先提供Coder编码类,该类封装了基本的Base64、md5和SHA加密解密算法。Java对这些算法的实现提供了很好的API封装,开发人员只需调用这些API就可很简单方便的实现数据的加密与解密。
? ? 下面提供RSA加密解密类,该类为Coder类子类,因为其中对RSA公私密钥的保存进行了一层Base64加密处理。
????RSA加密解密类静态常量
<div id="highlighter_542665" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">1
</td>
<td class="content">
<code class="spaces">???
<code class="keyword">public
?<code class="keyword">static
?<code class="keyword">final
?<code class="plain">String KEY_ALGORTHM=
<code class="string">"RSA"
<code class="plain">;
<code class="comments">//
</td>
</tr>
</table>
2
???
</tr></table>
3
</tr></table>
4
???
</tr></table>
5
???
</tr></table>
????RSA加密解密的实现,需要有一对公私密钥,公私密钥的初始化如下:
<div id="highlighter_599050" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
?? initKey()
?
</tr></table>
07
</tr></table>
08
</tr></table>
09
</tr></table>
10
?</tr></table>
11
</tr></table>
12
</tr></table>
13
</tr></table>
14
</tr></table>
15
?</tr></table>
16
keyMap =?
?(
</tr></table>
17
</tr></table>
18
</tr></table>
19
?</tr></table>
20
?
</tr></table>
21
</tr></table>
? ? ??从代码中可以看出密钥的初始化长度为1024位,密钥的长度越长,安全性就越好,但是加密解密所用的时间就会越多。而一次能加密的密文长度也与密钥的长度成正比。一次能加密的密文长度为:密钥的长度/8-11。所以1024bit长度的密钥一次可以加密的密文为1024/8-11=117bit。所以非对称加密一般都用于加密对称加密算法的密钥,而不是直接加密内容。对于小文件可以使用RSA加密,但加密过程仍可能会使用分段加密。
? ? 从map中获取公钥、私钥
<div id="highlighter_160499" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
?? keyMap)
?
</tr></table>
08
</tr></table>
09
?
</tr></table>
10
</tr></table>
11
</tr></table>
12
</tr></table>
13
</tr></table>
14
</tr></table>
15
</tr></table>
16
</tr></table>
17
</tr></table>
18
?? keyMap)?
?
</tr></table>
19
</tr></table>
20
?
</tr></table>
21
</tr></table>
? ? 对于RSA产生的公钥、私钥,我们可以有两种方式可以对信息进行加密解密。私钥加密-公钥解密 和 公钥加密-私钥解密。
? ??私钥加密
<div id="highlighter_139295" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
</tr></table>
08
???
</tr></table>
09
</tr></table>
10
</tr></table>
11
</tr></table>
12
?
</tr></table>
13
</tr></table>
14
</tr></table>
15
?</tr></table>
16
</tr></table>
17
</tr></table>
18
</tr></table>
19
?</tr></table>
20
?
</tr></table>
21
</tr></table>
????私钥解密
<div id="highlighter_312395" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
* @param data? 加密数据
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
???
</tr></table>
08
</tr></table>
09
</tr></table>
10
?</tr></table>
11
?
</tr></table>
12
</tr></table>
13
</tr></table>
14
</tr></table>
15
</tr></table>
16
</tr></table>
17
?</tr></table>
18
?
</tr></table>
19
</tr></table>
? ??公钥加密
<div id="highlighter_149560" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
</tr></table>
08
???
</tr></table>
09
</tr></table>
10
</tr></table>
11
</tr></table>
12
?
</tr></table>
13
</tr></table>
14
</tr></table>
15
?</tr></table>
16
</tr></table>
17
</tr></table>
18
</tr></table>
19
?</tr></table>
20
?
</tr></table>
21
</tr></table>
????私钥加密
<div id="highlighter_839700" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
</tr></table>
08
???
</tr></table>
09
</tr></table>
10
</tr></table>
11
?
</tr></table>
12
</tr></table>
13
</tr></table>
14
?</tr></table>
15
</tr></table>
16
</tr></table>
17
</tr></table>
18
?</tr></table>
19
?
</tr></table>
20
</tr></table>
? ??关于数字签名,先了解下何为数字签名。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。
? ? 数字签名的主要功能如下:
????保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
????数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
????数字签名是个加密的过程,数字签名验证是个解密的过程。
?????数字签名算法依靠公钥加密技术来实现的。在公钥加密技术里,每一个使用者有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。
????普通的数字签名算法包括三种算法:
????1.密码生成算法;
????2.标记算法;
???3.验证算法。
? ??通过RSA加密解密算法,我们可以实现数字签名的功能。我们可以用私钥对信息生成数字签名,再用公钥来校验数字签名,当然也可以反过来公钥签名,私钥校验。
? ??私钥签名
<div id="highlighter_759188" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
</tr></table>
08
???
</tr></table>
09
</tr></table>
10
</tr></table>
11
</tr></table>
12
?
</tr></table>
13
</tr></table>
14
</tr></table>
15
</tr></table>
16
</tr></table>
17
</tr></table>
18
</tr></table>
19
</tr></table>
20
</tr></table>
21
?</tr></table>
22
?
</tr></table>
23
</tr></table>
??? 公钥校验?
<div id="highlighter_877018" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tr>
<td class="number">01
</td>
<td class="content"><code class="preprocessor">/**
</td>
</tr>
</table>
02
</tr></table>
03
</tr></table>
04
</tr></table>
05
</tr></table>
06
</tr></table>
07
</tr></table>
08
</tr></table>
09
????
</tr></table>
10
</tr></table>
11
</tr></table>
12
</tr></table>
13
?
</tr></table>
14
</tr></table>
15
</tr></table>
16
</tr></table>
17
</tr></table>
18
?</tr></table>
19
</tr></table>
20
</tr></table>
21
</tr></table>
22
</tr></table>
23
?
</tr></table>
24
?</tr></table>
25
</tr></table>
? ? ???对于RSA如何加密文件、图片等信息,加密的信息又如何保存,怎样保存解密后的信息,以及操作过程中遇到的错误将如何处理,将在后面的文章中介绍给大家。?
<div class="BlogContent">原文:http://www.360doc.com/content/14/0324/16/834950_363341045.shtml
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 ? ??RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密算法。
????RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 ? ? 关于RSA算法的原理,这里就不再详加介绍,网上各种资源一大堆。下面就开始介绍RSA加密解密JAVA类的具体实现。 <div id="highlighter_527007" class="syntaxhighlighter "> |