iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
modulusとpublicExponentの二つのパラメータからRSA公開鍵のバイナリ値を生成する必要があった際に調べた事のメモだ。
RSA公開鍵のASN.1での定義は以下のとおり。
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
Apple Developer サイトの資料によると、公開鍵のバイナリ形式で、ASN.1の符号化の一つのDERということなので調べてみた。ただし、ASN.1について全ての情報は膨大なので、RSA公開鍵に関係がある部分のみの抜粋となっている。
SEQUENCEやINTEGER等のオブジェクトの形式は以下のとおり。
タグの番号は以下のとおり。
オブジェクトのタグ欄には、タグ番号がそのまま格納されるのではなくて以下の形式となっている。
7〜8bitのクラスは、汎用型のSEQUENCEとINTEGERのみなので、RSA公開鍵では00となる。
6bitの構造化は、INTEGERは単一型(0)、SEQUENCEは構造型(1)となる。なので、タグ欄にはINTEGERにはタグ番号そのものが設定され、SEQUENCEは、00+1+10000=0x30となる。
長さ欄は、以下のとおり。