1

ASN.1DERでエンコードされたRSA2048秘密鍵を解析して、係数、指数などのさまざまなコンポーネントを取得する必要があります。キーを調べると、一部のコンポーネントに先行ゼロが含まれていることがわかりました。これらのゼロはスキップされることになっていますか?はいの場合、コンポーネントの一部であるゼロをこれらの先行ゼロと区別するにはどうすればよいですか。私の特定のケースでは、プライベート指数フィールドの長さは256で、最初のバイトは0です。これは指数の一部ですか、それともスキップされることになっていますか。RSA 2048キーの場合、プライベート指数のサイズが常に256バイトになるかどうか。

[更新]ASN.1DERでエンコードされた値はビッグエンディアンで順序付けられているようです。したがって、コンポーネントの一部として先行ゼロを要求する意味はなく、スキップされることになっています。したがって、質問はプライベート指数のサイズに限定されます。RSA 2048キーがあり、プライベート指数のサイズは255バイトです。さまざまな秘密鍵コンポーネントを解析し、「RSAParameters」のオブジェクトに入力しました。RSACryptoServiceProvider.ImportParameters()を使用してこれをインポートしようとすると、エラーメッセージ「BadData」とともにCryptographicExceptionがスローされます。ImportParameters()が指数サイズも256バイトであると想定しているかどうか。さまざまな主要コンポーネントが正しいことを確認できるツールはありますか?

4

3 に答える 3

1

BERおよびDERでは、整数は2の補数としてエンコードされます。これは、正の数の最初のビットがゼロでなければならないことを意味します。これには、最初に追加のゼロバイトが必要になる場合があります。すべてゼロをエンコードする整数値の最初の9ビットを持つことは無効なBER/DERであることに注意してください。余分なゼロバイトは、ゼロ以外の最初のビットが負の数として解釈されるのを防ぐためにのみ追加されます。

于 2012-10-15T15:52:32.133 に答える
0

PKCS#1キーコンポーネントは、ASN.1符号付き整数と同様にエンコードされます(ASN.1はデータ型として符号なし整数を認識しません)。

したがって、正の数がバイト単位のキーサイズである場合、最初のビットは符号なし表記で1である必要があります。したがって、符号付き表記には、正の符号付き数値にするために00hに設定された追加のバイトが必要です。プライベート指数はモジュラスの値に制限されていますが、モジュラスよりも最大で数バイト小さい場合があることに注意してください。

モジュラスは正確なキーサイズである必要があり、キーサイズはほとんどの場合8の倍数であるため、常に00hのパディングが必要になります。


数値がビット単位のキーサイズである場合、定義上、最初のビットをオンにする必要があります。たとえば、8ビットの数値がある場合は、それをとして表す必要があります1XXX XXXX。これは、数値が2^7から2^8(排他的)の範囲であることを意味します。ここで、RSAキーのサイズは通常8で割ることができることを思い出してください(512、1024、2048、スコアはご存知でしょう)。これは、キーと同じサイズの数値には常に最初のビットが設定されることを意味します。したがって、符号付き数値として、パディングバイトが必要になります。

于 2012-10-12T23:13:05.243 に答える
0

Microsoftの実装は、ほとんどの場合よりも寛容ではありません。これについては、すでにいくつかの質問(および回答)があります。

于 2012-10-13T15:07:50.720 に答える