2011年7月18日 星期一

PKCS#1 unpadding

許多api都已經將unpadding綁在RSA的加解密功能裡。因此我們不常碰到自己解padding的情況。

而這個需求,jackmis就碰到了。

天呀,老師一定會覺得我玩完密碼學後真的學以致用了。(學密碼學的同學們出來很少有人再碰了)

以下介紹的PKCS#1 unpadding法,其實RSA實驗室的文件裡就有寫到。但是那篇文件轉來轉去,竟然把unpadding的部份省略了,jackmis就是那篇「簡化」過的文章的受害者。當然,也可能是RSA事後才補進去的。在下對這個歷史沒多大興趣,我們還是進入正題吧。有興趣的人也可以直接去RSA實驗室看原文。(我在這裡寫下來,是因為中文資源真的很少,讓小弟留下一些中文的資訊吧)

PKCS#1定義了RSA加解密的基礎規則。padding是用來補足資料長度,以便做RSA加密運算。當我們將密文解回來後,我們會看到一個落落長的資料。而明文,其實只是這個資料中的一部份。因此,我們要unpadding,跳過非資料的部份,取出我們所要的明文。

將密文正確解密後,應得到以下的資訊:
EB = 00 ∣∣ BT ∣∣ PS ∣∣ 00 ∣∣ D

「∣∣」是字串連接的意思。

EB是encryption block,就稱它為加密區塊吧。(因為我是讀加密的部份來看padding的方式,所以這裡的加密區塊,指的是,這串資料是準備要拿去加密的。)
開頭的00是1個十六進制的byte資料。
BT是block type,長度為1個byte。在文件中有00, 01與02三種。
PS就是重點的Padding字串,長度至少為8個byte。
然後再一個00。
D就是我們要取出來的明文。
整個EB的長度為128byte。文件中指稱可以擴張。

當BT為00時,我們要指定D的長度,或D的開頭必為00。如果知道D的長度,那當然就可以拿資料了(從後面拆),但走「D的開頭必為00」時要怎麼取D?這點jackmis還在想。也歡迎大家補齊。
BT為01或02時,必須確定PS中沒有00值。這樣的話只要從第10位byte(開頭的00+block type+至少8byte的PS)往後找到下一個00,之後的就是D了。

因為jackmis只用的到block type為02這種,所以其他沒研究...(人的一天只有24hr呀...),其他的,留給以後或各位幫忙囉。

沒有留言: