為什麼rsa加密時我把密鑰長度設成256位,太長的字元串加密就會出錯?

加密的字元串大概30位時就會出錯,不知道為什麼,生成的密鑰長度是256位的


感謝@鍾宇騰的回答,沒有padding的RSA稱為Textbook RSA,是在教科書中所教的基於數學原理的RSA,如Wikipedia頁面的RSA定義:

這裡所說的M指的是要加密的數據,但在實際應用的時候卻不一定為明文本身。

如果明文不加以處理則有可能受到攻擊。

舉個簡單的例子:

e選擇很小的值,如e=3;而且m<n^{frac{1}{3} } ,這時加密後的數據就會變成:

c=m^{3}mod n=m^{3}

只需要計算一個開三次根號就可以得到原文。在PKCS #1 v2.1標準裡面有定義這個padding RFC 3447 - Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1

Steps:

1. Length checking: If mLen &> k - 11, output "message too long" and
stop.

2. EME-PKCS1-v1_5 encoding:

a. Generate an octet string PS of length k - mLen - 3 consisting
of pseudo-randomly generated nonzero octets. The length of PS
will be at least eight octets.

b. Concatenate PS, the message M, and other padding to form an
encoded message EM of length k octets as

EM = 0x00 || 0x02 || PS || 0x00 || M.

EM = 0x00 || 0x02 || PS || 0x00 || M,PS是至少8位元組的非0隨機數。

這些padding由於具備隨機性同時還防止了CRT攻擊(Why RSA encryption padding is critical)


明文長度(Bytes) &<= 密鑰長度(Bytes)- 11

256bits = 32bytes

最長明文長度 = 32 - 11 = 21bytes = 168bits


如果想支持256bit以上的明文,那麼就需要自己實現分組加密。例如256bit密鑰,採用了padding,那麼一次可以加密的字元長度不能超過32-11=21個byte。同時分組加密後的明文在解密的時候也需要對應分組去解密。


RSA的標準裡面是沒有padding的。

但根據RSADSI頒布的RSA加密解密標準PKCS#1(為了避免RSA演算法的一些漏洞),在加密的時候,會在data前面加入至少11bytes的padding

第一byte全置0

第二byte為格式位,全置2時為加密,全置1時為簽名

接著是至少八byte的padding,random nonzero。

最後一byte全置0

因此padding總長至少為11byte。


目前主流密鑰長度至少都是1024bits以上,低於1024bit的密鑰已經不建議使用(安全問題)


推薦閱讀:

php如何實現數組合併但鍵值相同的數組不互相覆蓋?
學哪種編程語言能保住一頭秀髮?
.net的網站數據,可以轉到php程序里用嗎?
為什麼 C++ / PHP / Delphi / C# 的設計者都是丹麥人?
各個編程語言都有哪些「亮點」?

TAG:PHP | 加密 | RSA加密 |