サーバーと複数のクライアント間の暗号化方式に取り組んでいます。クライアントハードウェアは、基本的な暗号化アルゴリズム(現在、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よりも計算能力が少ない場合は、まったく異なるアプローチを検討します。
'strong'キーは、静的コンテンツを含む単なるhmacです。可能であれば、キー強化部分に [〜#〜] hkdf [〜#〜] を実装することをお勧めします。また、ランダムIVが十分にランダムであることを確認する価値もあります-そこにエラーがあると、物事がかなり詰まります。