メッセージの整合性、認証、および非否認


だから、あなたのお友達に自分の個人的な通信チャンネルを介してメッセージを送信すると、あなたは本当に誰か他の人がそれを見て気にしないので、しかし、あなたは本当にあなたの友人があなたに送信して受信したい場合は、他の何かを受信する必要はありません秘密情報を送信しないとしましょう.そして、時々、あなたは本当にそれがあなたにそのメッセージを送ったその特定の友人であると保証したいです.
この例で使用されたコードはJava(Java Cryptography Architecture)を使用してJCAに書き込まれました.

一体性とは
整合性は、不正なシステムまたはデータ変更の非認可のパーティーの不在です.
どのように我々は我々の通信チャネルを介して送信データの整合性を保証できますか?
手順を2つの主要部分に分割しましょう.
  • 送付者は送信するデータを保護しなければなりません
  • 受信機は、受信データが改ざんされていないかどうかを確認しなければならない.
    インテグリティ
    私たちはただ、データが改ざんされていないことを保証したいと思います.
    ハッシュ関数の考え方を紹介しましょう.
    暗号ハッシュ関数または衝突耐性ハッシュ関数
  • ハッシュテーブルのデータ構造で使用されるハッシュ関数と混同しないでください
  • 暗号ではなくcyphersです.
  • は暗号化に使用されません
  • 例:SHA 2.
  • ハッシュはキーを必要としません、次のコードで見ることができるように、我々はSHA-256を使用しています.そして、それは固定サイズ(256ビット)でハッシュを生成します.
    public byte[] hash(byte[] dataBytes) throws NoSuchAlgorithmException {
        MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
        byte[] dataHash = sha256.digest(dataBytes);
        return dataHash;
    }
    
    ハッシュを生成した後に、送付者がするべきことはハッシュでメッセージを送ることです.
    Mはデータであり、HはMのハッシュであるとしましょう.
    送付者は通信チャンネルを通してMHを送るべきです.
    もう一方の端に受信された受信機は、受信されたメッセージバイトを意味します.
    受信機はハッシュ' m 'を生成し、H 'を生成し、HとHを比較するべきです.

    認証
    認証を保証したいなら、メッセージの送付者を認証できる特定の何かがなければなりません.
    対称な暗号アルゴリズムでCypherとDecypherに使用できるキーです.
    前の例では、ハッシュを使用しましたが、これはどんな種類のキーも必要としませんでしたが、今では送信者を認証したいと思います.
    前の例のように、メッセージ+ MACを送ります.
    このために、ハッシュベースのMAC(データのハッシュと秘密の値)を使用します.
    それはハッシュだけを必要とします
    -例: HMAC - SHA 2
    public byte[] mac(byte[] dataBytes) throws NoSuchAlgorithmException {
          Key key = getKey(keyFilePath);
          // get a MAC object and print the provider
          Mac mac = Mac.getInstance("HmacSHA256");            
          //Creating Mac ...
          mac.init(key);
          return mac.doFinal(dataBytes);
    }
    
    Mはデータであり、HはMのMACで、キーKを使っているとしましょう.
    送付者は通信チャンネルを通してMHを送らなければなりません、もう一方の端に受信されたM ' H M 'は受信されたメッセージバイトを意味します.
    受信機は同じキーKを使ってM 'のMACを生成し、HとHを比較するべきである.
    これにより、ユーザを認証し、送信データが変更されていないかどうかを確認することができます.

    非人称
    我々は、以前のすべてのプロパティを保証し、また、送信者が彼がそのメッセージを送信した人ではないと言うことができないことを保証します.
    ですから、
  • 文書の内容を認証する
  • 署名者を認証する
  • 第三者に向けて認証を保証することができる
  • 署名者は、署名を否認することはできません.これはデジタル署名の概念です.
    デジタル署名は非対称キー、公開鍵と秘密鍵を使用します.
    公開鍵は他の人の間でパブリックで共有できますが、秘密鍵の所有者だけがそれを持つことができます.
    秘密鍵の所有者だけがそのデータに署名することができると言うことができるデータのハッシュに署名するために秘密鍵を使用します.

    署名を得る
    public static byte[] generateDigitalSignature(byte[] data, String privateKeyFilePath) throws Exception {
                Key privateKey = readPrivateKey(privateKeyFilePath);
                Signature signature = Signature.getInstance("SHA256withRSA");
                signature.initSign(privateKey);
                signature.update(data);
                byte[] sign = signature.sign();
                return sign;
        }
    
    受信したメッセージの整合性、認証、署名を確認したい人は、次の例に示すように公開鍵を知っている必要があります.

    署名の検証
     public static boolean verifySignature(byte[] messageBytes, byte[] dataSignature, String publicKeyFilePath) throws Exception {
                Key publicKey = readPublicKey(publicKeyFilePath);
                Signature signature = Signature.getInstance("SHA256withRSA");
                signature.initVerify(publicKey);
                signature.update(messageBytes);
                return signature.verify(dataSignature);
        }
    

    概要
    多くの通信チャネルを通してメッセージを送る間、我々は保存したいかもしれない多くの特性です.通常は増分で、新しいプロパティを追加したい場合は、通常は前のものを保証します.
    次の表は、記事全体の概要です.
    Cryptographic primitive | Hash |    MAC    | Digital
    Security Goal           |      |           | signature
    -----------------------------+------+-----------+-------------
    Integrity               |  Yes |    Yes    |   Yes
    Authentication          |  No  |    Yes    |   Yes
    Non-repudiation         |  No  |    No     |   Yes
    -----------------------------+------+-----------+-------------
    Kind of keys            | none | symmetric | asymmetric
                            |      |    keys   |    keys
    
    これは私の最初のポストだったので、あなたはそれを楽しんでほしい!
    何か間違ったものを見つけたらコメントをしてください.
    あなたは私を見つけることができます.