web-dev-qa-db-ja.com

基本的な暗号化機能のみをサポートするシステムの暗号化

サーバーと複数のクライアント間の暗号化方式に取り組んでいます。クライアントハードウェアは、基本的な暗号化アルゴリズム(現在、Aes 128ビットおよびHmacSha1)のみをサポートしています。ハードウェアが単純すぎてTLS/SSLをサポートできません。 Embedded System Communications Security について読み、またチェックしました https://stackoverflow.com/questions/5235161/aes256-cbc-hmac-sha256-ensuring-confidentiality-and-authentication

この情報を組み合わせて、各クライアントに固有でサーバーにも認識されている弱いマスターキーを取得するEncryptionClassを思いつきました。このクラスはHmacSha1を使用して、暗号化と認証のためのより強力なキーを生成します。次のようになります(擬似コード):

EncryptionClass(weakMasterK) {
    HmacSha1.init(weakMasterK)
    strongEncrK = HmacSha1.doFinal(0) // zero constant in bytes
    strongAuthK = HmacSha1.doFinal(1) // one constant in bytes

    // Message encryption:
    AesCipher.init("ENCRYPT_MODE", strongEncrK)
    AesCipher.doFinal(random IV || message)

    // Message decryption:
    AesCipher.init("DECRYPT_MODE", strongEncrK)
    AesCipher.doFinal(encrypted data)

    // Hash generation (for authentication):
    HmacSha1.init(strongAuthK)
    HmacSha1.doFinal(encrypted message)
}

私は暗号化の専門家ではないという事実を考えると、このアプローチ、特にキーの生成と使用の方法に問題があるのではないかと思っていました。また、TLS/SSLよりも計算能力が少ない場合は、まったく異なるアプローチを検討します。

1
david

'strong'キーは、静的コンテンツを含む単なるhmacです。可能であれば、キー強化部分に [〜#〜] hkdf [〜#〜] を実装することをお勧めします。また、ランダムIVが十分にランダムであることを確認する価値もあります-そこにエラーがあると、物事がかなり詰まります。

1
C_Sto