8

AES128 (CBC) 暗号化を実行するペリフェラルを備えた STM32L152xx に取り組んでいます。ただし、ランダムな IV を初期化するために、暗号的に安全な乱数シーケンスを作成するための適切なスキームを探しています。今のところ、単純な LCRG (線形合同ジェネレーター) をプレースホルダーとして使用していますが、これは弱いです。

組み込みプラットフォームに暗号化を実装するのは初めてなので、暗号化された PRNG を生成するための一般的な方法は何だろうか? または、キーと IV を選択するための優れた戦略は何ですか?

暗号化 PRNG の StackOverflow に関する回答のほとんどは、このプラットフォームでは利用できないサードパーティ ライブラリを参照しています。ただし、試してみる価値がある場合は、移植を試みることができます。リソースへのリンクとポインタも役立ちます。

搭載されているシステム クロックと加速度計にアクセスできます。FreeRTOS を実行しています。ありがとう!

4

3 に答える 3

9

おそらく、「Cryptographically Secure」またはアプリケーションをもう少し適切に定義する必要があります。これが携帯電話のゲームの場合は、おそらく加速度計をランダム性のソースとして使用できます。x.509 証明書に署名しようとしている場合は、放射性崩壊を測定する付属のハードウェアを検討することができます。

真剣に、必要な「ランダム性」の強さに応じて、次のことを検討してください。

  1. ナノ秒ごとに刻むクロックの現在の 32 ビット値 (約 4 秒の周期 - シードが必要な頻度に応じて、おそらく「ランダム」で十分です)。この値を決定論的な方法で取得しないようにする必要があります。ユーザー入力に基づいて取得する場合は、おそらく問題ありません。
  2. シュミット トリガー入力に供給されるアバランシェ ノイズ ジェネレーター。
  3. 加速度計のすべての軸の排他的論理和 (通常のアプリケーションで振動を拾わない限り、物が常に静止している場合は良くない可能性があります)。持ち歩くラジオならこれでいいかな。
  4. 初期化されていないメモリの大きなチャンクの値 (初期化されていないメモリの大きなセクションには、電源投入時から電源投入時まで同様の値が含まれている可能性があるため、おそらくハッシュする必要があります)。また、デバイスの電源が完全にオフにならない場合、これはおそらく良くありません。
  5. 上記の 1 つまたは複数の組み合わせ (排他的 OR は、おそらく上記の出力の 2 つを組み合わせる最も簡単な方法です)
  6. コメディ オプション:溶岩ランプに向けられた CCD カメラ

上記の方法のいずれにも、ある種のバイアス除去アルゴリズムを適用する必要がある場合があります。最も簡単な方法は、一度に 2 ビットの入力を考慮することです。2 つのビットが等しい場合は、それらを破棄します。0b10 は 1 になり、0b01 は 0 になります。これにより、最終的なランダム値で多かれ少なかれ同じ数の 1 と 0 が得られるようになります。

最後に、これが重大な問題である場合は、上記のアドバイスをすべて無視し、独自の暗号をロールしないでください。すでに精査されているプラ​​ットフォーム用の API を見つけて使用します。アルゴリズムのランダム性をテストするのは非常に困難です。

おそらく、明らかにハードウェア RNG を含むSTM32 コアの F-2 シリーズを考えてみてください。

于 2013-03-23T00:13:01.130 に答える
3

Pete Braughman の回答は、この質問に対する適切な回答とは何かをカバーしています: 偏りをなくし、エントロピーの弱いソースを組み合わせることです。プロセスで初期化されていないメモリを使用するのは少しためらいます。初期化されていないメモリが悪意のあるユーザーによって以前に使用されていないという前提に基づいたシステムが侵害される可能性があるというシナリオを考えることができます。それ以外には、私が反対できることはあまりありません。

すでに発明されている可能性のある車輪を再発明する時間を節約するために、まだ行っていない場合は、 cryptlibを簡単に見てみることをお勧めします。" cryptlib の移植性の高い性質は、AMX、ChorusOS、eCos、FreeRTOS/OpenRTOS、uITRON、MQX、PalmOS、RTEMS、ThreadX、T-Kernel、uC/OS II など、さまざまなカスタム組み込みシステム環境でも使用されていることを意味します。 VDK、VxWorks、および XMK です。 " このライブラリがほとんどの作業を行います。cryptlib を使用することが実行可能であると仮定すると、(複数のソースからの) ランダムな情報を供給するだけでよい場合があります。ランダム データ収集操作は、cryptAddRandom 関数で制御されます。この関数は、独自のランダム情報を内部ランダム プールに挿入するか、cryptlib にシステムをポーリングしてランダム情報を取得するように指示するために使用できます。"

于 2013-03-23T00:29:04.987 に答える
0

これはかなり古い質問であることは知っていますが、暗号学的に安全な PRNG についてまだ誰も言及していないので、参加したいと思いました。前者はHMACに基づいており、後者はCTR モードの AES に基づいています。これら 2 つの PRNG は、FreeRTOS でも実行される PolarSSL で利用できます。DUAL_EC_DRBG を使用しないように注意してください。これはNSA によってバックドアされており、今後使用されることはありません。

最も重要なことは、これらの PRNG をシードするためのエントロピー ソースが必要なことです。残念ながら、これは組み込みデバイスの難しい部分です。ADC 出力の取得など、このブログでいくつかのアイデアを見つけることができます。

具体的に IV では、もう 1 つの重要な基準は、予測不可能であることです。つまり、現在の暗号文が与えられた場合、攻撃者が次の暗号文の IV を予測する体系的な方法はないはずです。これは、TLS 1.0 に対する BEAST のような攻撃を避けるためです。

最後に、この種の質問については、 crypto.stackexchange.comで優れた回答が得られる可能性が高くなります。

于 2014-07-31T05:04:39.730 に答える