RSA
加密与数字签名
主要应用就是
signature
和
cipher
。
什么是数字签名?
我们假定传输的过程都是不安全的,
数字签名就是对内容进行签名。
这个签名的原理是,
将
要签名的内容
(比如是一张大图片,
一部电影)
通过不同签名算法
(
hash SA1
,
MD5
,
MD160
等)得出一个
hashM
,比如这个
hashM
为二十字节。然后就是对这二十字节进行操作,得
出一个定长的
Em
。这个
Em
就是我们
RSA
加密所用的明文
M
。
操作过程大致为开头加
0x00
后面加上
0x02
或者
0x01
(
01
和
02
有区别)然后是一堆的
padding
,
padding
一般用
0xFF
结束,然后跟上
hashID
,之后再加上
hashM
。这样组成一个
可以用于
RSA
加密的明文长度,我们称之为
Em
,也就是加密所用的明文
M
。也就是说无
论
hashM
是多长(各种算法,
hashM
可能不是一样长)
,但是
Em
肯定是定长的。这个时候
通过
RSA
算法
C = M
e
mod N
。这时候
C
就是签名,称之为
signature
,
veryfire
就是把
C
在
还原成
M
(
C
—
>M
)
。
这时候的
M
就是签名中的
Em
。
别人使用相同的方法
(
hash SA1
,
MD5
,
MD160
等)把我们传输的内容(比如一张大图片,一部电影)计算得出一个
hashM
。这个
hashM
和解密出来的
hashM
进行比较,一致就说明传输没有被修改。其实这个和我们平时
在某个文件上进行签名的原理是一样的,
就是一个加记号,
别人看见这个记号的时候就知道,
哦,这就是你签的那个文件(他认识你的笔迹就像我们使用
RSA
算法一样)
RSA
加密原理(
C=M
e
mod N
)
C
我们认为是密文,
M
我们认为是明文(就是一串大数字,任何文件在计算机存储都是数
字)
,
mod
就是取余数,
(
e
,
N
)就是公钥。
e
(尽可能的时素数)可能是
2,3
或者常用的
F4
(
010001=65537
)
密钥对(
keypair
)
,一个完整的密钥是一对,分为公钥和私钥。公钥(
e
,
N
)
,私钥(
d
,
N
)
。
我们常说的
1024bit
和
2048bit
加密就是指这里
N
的长度。
Ln=Ld>=Le
(长度)
,
比如
2048bit
的加密则
N
和
d
都是
2048bit
。
N
就是两个大素数的乘积,
N = p*q
(
p
,
q
就是这对大素数)
,
则
Lc=La+Lb
或者
Lc=La+Lb-1(
任何的进制的数据都是这样的
)
。
这样我们想生成一个
2048bit
的
N
,则
p
,
q
都可以是
128bit
的素数,当然
p
,
q
可以不一样长,但是
p
,
q
应该尽量保持
同样的长度,以提高加密的可靠性和安全性。
对于密钥对而言,我们认为谁拥有私钥,
是就
是密钥对的产生者。
CRT
五元组(
p
,
q
,
dp
,
dq
,
q
INV
)五元组计算公式
Mp = C
dp
mod p
Mq = C
dq
mod q
M = ((( Mp
–
Mq)*q
INV
) mod p)*q + Mq
五元组就是提高效率,他其实就是解密的一个步骤,就是相当于把私钥
d
分解了,这个
d
的分解就是解密中的步骤。所以五元组大多是用于解密。这也是他为什么快的原因。
Javacard API
的
RSA
加密可以分为几个步骤。
Init
,
updata
,
dofinal
。
Init
就是密钥的初始化,明文,密文的传送。
Dofinal
计算。