ネットワーク全体の暗号化および復号化アルゴリズムに関する最も詳細な知識の概要と Java デモ

暗号の概念と応用

暗号は長い歴史を持つ科学です。暗号の過去と現在については、本書を参照してください。

https://crypt.wenwoha.com/preface/index.html

1. 暗号とは何ですか

暗号化は、コードを使用して情報と通信を保護し、情報の意図された受信者のみが情報を読み取って処理できるようにするためのスキームです。暗号化は、次のようなさまざまなアプリケーションで使用される重要なセキュリティ ツールです。

  • 安全な通信。暗号化は、電子メール、Web ブラウジング、ファイル転送など、転送中のデータを保護するために使用されます。たとえば、https で一般的に使用される TLS/SSL テクノロジー
  • 静的データ。暗号化は、パスワード、財務情報、医療記録など、コンピューターに保存されているデータを保護するために使用されます。
  • デジタル署名: 暗号化はデジタル署名の作成に使用され、メッセージまたはドキュメントの信頼性を検証するために使用できます。
  • 否認防止: 暗号化を使用して否認防止を実現できます。これは、送信者がメッセージの送信を拒否したり、受信者がメッセージの受信を拒否したりできないことを意味します。

暗号は紀元前 400 年にはすでに作られており、人類による暗号の使用の歴史は言葉の使用とほぼ同じくらい長いです。

暗号技術の開発は、大きく次の 3 つの段階に分けることができます。

  1. 1949 年以前の古典的な暗号の段階。

  2. 1949 ~ 1975 年 科学の一分野としての暗号化。

  3. 1976 年以降、対称キー暗号化アルゴリズムはさらに開発され、その結果、暗号化の新しい方向性である公開キー暗号化が生まれました。

    1976 年に、W. Diffie と M. Hellman が、出版された記事「暗号化の新しい方向性」の中で公開鍵暗号化の概念を初めて公に提案しました。公開鍵暗号方式の提案は、暗号鍵と復号鍵の独立性を実現し、対称暗号方式における通信当事者間で鍵を共有しなければならないという問題を解決するものであり、暗号分野において画期的な意義を持つ。

2. 対称暗号化と非対称暗号化

既存の人類社会における暗号の応用方法は、対称暗号と非対称暗号にほかなりません

対称暗号化: 対称キー暗号化では、単一のキーを使用してデータの暗号化と復号化を行います。このタイプの暗号化は比較的高速ですが、送信者と受信者が秘密キーを共有する必要があります。

非対称暗号化: 非対称キー暗号化では、公開キーと秘密キーの 2 つのキーを使用します。公開キーはデータの暗号化に使用され、秘密キーはデータの復号化に使用されます。このタイプの暗号化は対称キー暗号化よりも低速ですが、送信者と受信者の間で共有キーを必要としません。

2.1 市場で一般的に使用されている対称暗号化

現在市場に流通している一般的な対称暗号化方式には、DES、3DES、AES、TDEA、Blowfish、RC2、RC4RC5 などがあります。

2.1.1 DES と 3DES

Data Encryption Standard (DES) および Triple DES (3DES) は、データの暗号化に使用されるブロック暗号です。DES のキー サイズは 56 ビットですが、3DES のキー サイズは 112 ビットまたは 168 ビットです。これは、3DES キーの解読には DES キーよりも時間がかかるため、3DES の方が DES よりも安全であることを意味します。

DES は 1977 年に初めてリリースされ、長年にわたってデータ暗号化の標準として使用されてきました。しかし、コンピュータの性能が向上するにつれて、DES をクラックするのが容易になってきました。1999 年、distributed.net プロジェクトは 22 時間で DES キーを解読することができました。

3DES は、DES のセキュリティ ホールが増加していることに対応して開発されました。3DES は、2 つまたは 3 つのキーを使用してデータを 3 回暗号化することで機能します。これにより、3DES は DES よりもはるかに安全になり、現在でも安全であると考えられています。

ただし、3DES は 3 つの暗号化操作が必要なため、DES よりも遅くなります。このため、3DES は速度が重要なアプリケーションにはあまり適していません。

現在、3DES は、Advanced Encryption Standard (AES) などの、より安全な新しいブロック暗号に置き換えられています。AES のキー サイズは 128 ビットで、現在利用可能なブロック暗号の中で最も安全であると考えられています。

2.1.2 AES アルゴリズム

AES (Advanced Encryption Standard) は、現在利用可能なブロック暗号の中で最も安全であると考えられており、現在世界で最も広く使用されている対称暗号化アルゴリズムです。それは今日に至るまで依然として支配的な地位を保っています。

AES は、米国政府がデータ暗号化標準 (DES) の代替として選択したときに誕生しました。AES はブロック暗号であり、データを 128 ビットのブロックで暗号化することを意味します。AES には、128、192、256 ビットの 3 つのキー サイズがあります。キーのサイズによって暗号化の強度が決まります。128 ビット キーは非常に安全であると考えられており、現在のテクノロジーでは解読することは不可能です。192 ビットのキーはより安全ですが、256 ビットのキーは解読不可能とみなされます。

2.1.3 RC アルゴリズム

RC アルゴリズムは、Ron Rivest によって発明された一連の対称キー暗号化アルゴリズムです。「RC」はリベストの暗号、またはより口語的にはロンの暗号を表す可能性があります。名前は似ていますが、これらのアルゴリズムにはほとんど関連性がありません。これまでに 6 つの RC アルゴリズムがあります。

  • RC1はリリースされませんでした。
  • RC2 は 1987 年に開発された 64 ビットのブロック暗号です。
  • RC3は使用前に壊れてしまいました。
  • RC4 はストリーム暗号です。
  • RC5 は 1994 年に開発された 32/64/128 ビットのブロック暗号です。
  • RC6 は、1997 年に開発された AES 最終候補である RC5 を主にベースにした 128 ビット ブロック暗号です。

RC4 は、最も広く使用されている RC アルゴリズムです。これはストリーム暗号であり、一度に 1 ビットまたはバイトずつデータを暗号化します。RC4 は非常に高速なアルゴリズムであり、ソフトウェアでの実装が簡単です。RC4 は、次のようなさまざまなアプリケーションで使用されます。

  • Secure Sockets Layer (SSL): SSL は、インターネット上を移動するデータを暗号化するために使用されるプロトコルです。RC4 は、SSL の暗号化アルゴリズムとして一般的に使用されます。
  • ワイヤレス ネットワーク: RC4 は、Wi-Fi や Bluetooth などのワイヤレス ネットワーク上のデータを暗号化するために一般的に使用されます。
  • ファイル暗号化: RC4 は、パスワード ファイル、財務ファイルなどのファイルの暗号化によく使用されます。

2.1.4 主な実装

Java のネイティブ JDK は、上記の対称暗号化アルゴリズムのほぼすべてを提供しますが、JDK1.8 以降、Oracle プロトコルが変更され、プライベート パッケージにアクセスできない可能性があるため、推奨される実装は依然として Bouncycastleです

JDK は、暗号化と復号化をサポートするクラスをネイティブに提供しますCipher

暗号化された AES の例:

// 创建一个密码实体,使用AES Provider
Cipher cipher = Cipher.getInstance("AES");

// 随机生成一个key
SecretKey key = KeyGenerator.getInstance("AES").generateKey();

// 执行加密模式
cipher.init(Cipher.ENCRYPT_MODE, key);

// 得到加密数据
byte[] encryptedData = cipher.doFinal(plaintextData);

AES の復号化の例:

// 创建一个密码实体,使用AES Provider
Cipher cipher = Cipher.getInstance("AES");

// 随机生成一个key
SecretKey key = KeyGenerator.getInstance("AES").generateKey();

// 执行解密模式
cipher.init(Cipher.DECRYPT_MODE, key);

// 得到解密数据
byte[] decryptedData = cipher.doFinal(encryptedData);

実際の運用では、特定の文字列をキーとして使用し、同時にキーの安全性も確保します。

2.1.5 Bouncy Castle 暗号スイート

現在最も普及している Java による暗号化実装であるため、別途紹介する必要があります。

Bouncy Castle は、Java で書かれた無料のオープンソース暗号ライブラリです。次のような幅広い暗号化アルゴリズムとツールを提供します。

  • AES、DES、3DES などのブロック暗号
  • RC4 や Salsa20 などのストリーム暗号
  • SHA-256やSHA-512などのハッシュ関数
  • RSA や DSA などのデジタル署名
  • DH アルゴリズムや ECC 楕円曲線アルゴリズムなどの鍵交換アルゴリズム

現在の最新バージョンは 1.74 で、最後の更新は 6 月 12 日です。安定バージョンを保持してください。

詳しい紹介については、公式 Web サイトhttp://www.bouncycastle.org/をご覧ください。

jceをベースに楽しく使っていきます。使用例:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.Security;

public class EncryptMessage {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 注册bc的算法提供者
        Security.addProvider(new BouncyCastleProvider());

        // 生成128密钥位的密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();

        // 创建密码对象并设置为加密模式
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 加密消息
        byte[] encryptedMessage = cipher.doFinal("Hello, world!".getBytes());
    }
}

2.2 市場で一般的に使用されている非対称暗号化

一般的な非対称暗号化アルゴリズムには、**RSA、Elgamal、ナップザック アルゴリズム、Rabin、DH、ECC (楕円曲線暗号化アルゴリズム)** などがあります。

世界で広く使われている非対称暗号は依然として RSA ですが、その優位性から ECC アルゴリズムがますます主流になりつつあります。

2.2.1 RSA暗号化

RSA アルゴリズムは、理論的にはこれまでのところ比較的成熟した完全な公開鍵暗号システムであり、非対称暗号システムの代表的なものです。RSA アルゴリズムは、ネットワークや情報セキュリティなどのさまざまな側面で使用されており、特に通信における RSA アルゴリズムの典型的なアプリケーションのデジタル署名は、相手の身元と否認防止の検証を実現できます。ID認証、情報セキュリティ、電子商取引など幅広い応用が期待されています。

2.2.1.1 基本原則

RSA アルゴリズムは、キー生成、暗号化アルゴリズム、復号化アルゴリズムの 3 つの部分で構成されます。

鍵の生成プロセスは次のとおりです。

  1. 2 つの大きな素数 p と q を生成します。
  2. n = p × qn = p \times qを計算します。n=p×q、オイラー関数φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) =(p - 1)(q - 1)φ ( n )=( p1 ) ( q1 )
  3. 次の条件を満たすように整数 e を選択します: 1 < e < φ(n)、および gcd(e,φ(n)) = 1 (注: gcd () 関数は 2 つの数値の最大公約数を計算します)。
  4. e の逆元 d を計算します: d∙e ≡ 1 mod φ(n) (注: gcd(e,φ(n)) = 1 であるため、d が存在する必要があります)。
  5. シーケンスのペア (e,n) は公開できる公開キーであり、(d,n) は秘密に保たれる秘密キーです。

暗号化アルゴリズムのプロセスは次のとおりです。

送信する文字列を長さがm < nのグループに分割し、そのグループmiに対して暗号化演算を実行して暗号文を取得します。

ci ≡ ( mi ) e mod n ci ≡(mi)e \bmod n_()モッドn

復号化アルゴリズムのプロセスは次のとおりです。

暗号文 ci を受信した後、受信者は自分の秘密キーを使用して復号化操作を実行し、平文を取得します。

mi ≡ ( ci ) d mod n mi ≡(ci)d \bmod n( c i ) dモッドn

2.2.1.2 アプリケーション

Java 側では、BouncyCastle を使用して RSA をサポートできます。

// 生成密钥对
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
KeyPair pair = generator.generateKeyPair();

// 得到公钥
PublicKey publicKey = pair.getPublic();

// 加密消息
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedMessage = cipher.doFinal("Hello, world!".getBytes());

// 获得私钥
PrivateKey privateKey = pair.getPrivate();

// 解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage = cipher.doFinal(Files.readAllBytes(Paths.get("encrypted-message.txt")));

RSA は、次のようなさまざまなアプリケーションで使用できます。

  • 安全なメッセージング: RSA を使用してメッセージを暗号化および復号化できます。
  • データ暗号化: RSA を使用してデータ ファイルを暗号化できます。
  • デジタル署名: RSA を使用してデジタル署名を生成および検証できます。
  • 鍵交換: RSA を使用して鍵を安全に交換できます。
  • Web セキュリティ: RSA を使用して、SSL/TLS や X.509 証明書などのさまざまな Web セキュリティ機能を実装できます。

2.2.2 ECC楕円曲線アルゴリズム

楕円曲線暗号 (ECC) は、楕円曲線数学に基づく非対称暗号アルゴリズムであり、楕円曲線に基づく離散対数問題に基づく暗号システムです。

大きな整数を分解する方法の進歩とさまざまな側面の改善により、RSA アルゴリズムは徐々に現状に対応できなくなり、ECC アルゴリズムの需要が徐々に増加しています。ECC は、明らかな「短いキー」の利点により広く使用されており、多くのエンコード方式のデジタル署名標準として徐々に決定されてきました。

もちろん、ECC にはまだ多くの未解決の問題が残っていますが、豊富な数学理論を引用したこのアルゴリズムは、暗号の分野により多くの数学を適用することがより実現可能であることも裏付けています。

2.2.2.1 ECCの原理

まず、アルゴリズム暗号化の原理を数学的な観点から説明します. ECC 楕円曲線暗号化アルゴリズムの数学的基礎は、有限体上の楕円曲線離散対数問題 (ECDLP) の計算難易度を利用することです。楕円曲線と呼ばれるものはウェルストラ方程式を指します。その楕円曲線方程式は次のとおりです。

y 2 + a 1 xy + a 2 y = x 3 + a 3 x 2 + a 4 x + a 5 y^2 + a_1xy + a_2 y = x^3 + a_3x^2 + a_4 x + a_5y2+ある1+ある2y=バツ3+ある3バツ2+ある4バツ+ある5

2.2.2.2 ECCの適用

ECC の目的は RSA の目的とほぼ同じですが、RSA または ECC を選択する際に主に考慮すべき点は、サポートされるシナリオの広さです。

ECC キーは従来の RSA キーよりもはるかに小さいため、使用効率が高くなります。ECC キーは RSA キーよりも安全であると考えられているため、オンライン バンキングや電子商取引など、高度なセキュリティが必要なアプリケーションに適しています。

ECC の主な目的は SSL アクセスを高速化することであり、同じセキュリティの下でサーバーのパフォーマンスを明らかに向上させることができます。最新の Web ブラウザとサーバーのほとんどは ECC 証明書をサポートしています。ただし、一部の古いブラウザおよびサーバーは ECC 証明書をサポートしていません。

ECC 証明書をサポートする最も一般的なブラウザとサーバーの一部を次に示します。

  • Web ブラウザ: Chrome、Firefox、Edge、Safari、Opera
  • サーバー: Apache、Nginx、IIS

2.2.3 SSL/TLS および関連テクノロジー

ネットワークのセキュリティを実現するために、https プロトコルで送信されるすべてのデータは暗号化されます。

TLS/SSL では、非対称暗号化、対称暗号化、および HASH アルゴリズムが使用されます
ここに画像の説明を挿入

2.2.3.1 DH アルゴリズム

Diffie-Hellman 鍵交換 (DH と略称) は、安全でない通信ネットワーク上で共有秘密鍵を確立するために双方が使用するセキュリティ プロトコルです。共有秘密鍵を取得した後、この鍵を使用して対話型メッセージを暗号化できます通信の双方で使用される鍵は同じであるため、プロトコルの目的は対称鍵を作成することであると考えることができます (対称鍵と非対称鍵はそれ自体で学習できます)。このプロトコルは Diffie-Hellman 鍵協定とも呼ばれ、その名前は発明者の名前にちなんで命名されており、規則に準拠しており、他の特別な意味はありません。

ここに画像の説明を挿入

Diffie-Hellman 鍵交換自体は匿名 (未認証) 鍵交換プロトコルであり、多くの認証プロトコルの基礎であり、トランスポート層セキュリティ プロトコルの一時モードでフォワード セキュリティを提供するために使用されます。

DH プロトコルは、SSL がキー交換を実現するためのコア アルゴリズムであり、送信中のキーのセキュリティと信頼性を保証できます。

2.2.3.2 SSL および TLS プロトコル

SSL (Secure Socket Layer、Secure Socket Layer): 1994 年に Netscape によって開発された SSL プロトコルは、TCP/IP プロトコルとさまざまなアプリケーション層プロトコルの間に位置し、データ通信のセキュリティ サポートを提供します。

TLS (Transport Layer Security、トランスポート層セキュリティ): その前身は SSL です。

最初のいくつかのバージョン (SSL 1.0、SSL 2.0、SSL 3.0) は Netscape によって開発され、1999 年の 3.1 から IETF によって標準化され、名前が変更されました。現在までに、TLS 1.0、TLS 1.1、および TLS の 3 つのバージョンがあります。 1.2. SSL3.0 と TLS1.0 は、セキュリティ ホールがあるため、ほとんど使用されません。TLS 1.3には大きな変更が加えられ、セキュリティとアクセス速度が大幅に向上し、最新のすべてのブラウザで十分にサポートされています。

ただし、現在最も広く使用されているのは TLS 1.1 と TLS 1.2 です。

2.3 私の国の標準暗号化プロトコル

国家機密とは、国家暗号局によって認められた国内の暗号化アルゴリズムを指します。主にSM1、SM2、SM3、SM4があります。キー長とブロック長は両方とも 128 ビットです。SM1 は対称暗号化、SM2 は非対称暗号化、SM3 はメッセージ ダイジェスト、SM4 はブロック暗号アルゴリズムです。

SM2 アルゴリズムは、楕円曲線 ECC アルゴリズムに基づいており、RSA よりも性能が優れているため、従来の暗号化サービスでは、効率的なコンテンツ交換を実現するために、RSA アルゴリズムの代わりに SM2 アルゴリズムの使用を検討することがよくあります。

現在、中国の多くのオープンソースコンポーネントは国家機密アルゴリズムを完全に実装しており、JavaからJavaScript、C++まで、ニーズに応じて我が国の国情に合った暗号化アルゴリズムを選択して製品のセキュリティを高めることができます。

国家機密の詳細な実装原理と Java アプリケーションについては、興味がある場合は次の投稿を参照してください。

https://crypt.wenwoha.com/china/index.html

3. 一方向ハッシュ関数(アルゴリズム)

実際、この章の範囲は暗号化には属しませんが、これらの概念は混同されることが多いため、特に強調して説明します。

一方向ハッシュ関数、ハッシュ関数とも呼ばれる一方向ハッシュ関数は、任意の長さの入力メッセージ文字列を固定長の出力文字列に変更する関数であり、出力文字列から入力文字列を取得することは困難です。 。この出力文字列をメッセージのハッシュ値と呼びます。通常、メッセージ ダイジェスト、キー暗号化などを生成するために使用されます。

現在、最も一般的に使用されているアルゴリズムは MD5 で、次に SHA、SHA-2、SHA-3 などが続きます。

一方向ハッシュ関数は不可逆的、つまり復号化できないため、暗号化には属さないことに注意してください。しかし、当然のことながら暗号化のカテゴリーに属し、人間はデータのセキュリティを確保するためにそれを使用します。

3.1 MD5アルゴリズム

MD5 は、RSA Data Security Company によって開発された一方向ハッシュ アルゴリズムで、広く使用されており、さまざまな長さのデータ ブロックを 128 ビット値に暗号化するために使用できます。値が異なれば、結果も異なります。

3.1.1 MD5の実装

Java 言語に関する限り、JDK は MD5 アルゴリズムの基本サポートをカプセル化しており、このアルゴリズムを実装するサードパーティ ライブラリも多数あります。最も広く使用されている実装は、java.security パッケージで定義されている MessageDigest クラスです。

import java.security.MessageDigest;

public class MD5 {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 创建一个消息摘要对象
        MessageDigest digest = MessageDigest.getInstance("MD5");

        // 将要计算的文本转换为字节数组
        byte[] data = "Hello, world!".getBytes();

        // 更新消息摘要对象内的数据体
        digest.update(data);

        // 计算得到摘要结果
        byte[] digestValue = digest.digest();

        // 将摘要结果转换为32位的hex数字文本
        String hexString = new String(digestValue, "UTF-8");
        
        // 将输出 97c992559122e4d1f4a42fd7a2fdb848
        System.out.println(hexString);
    }
}

通常、文字列を入出力端子として使用するため、ほとんどの場合、ツール クラスを単純にカプセル化します。

さらに、JavaScript には、md5js など、すでに md5 をサポートする成熟したライブラリが多数あります。

3.1.2 MD5の使用法

一貫性の検証

MD5 の一般的な用途は、改ざんを防ぐためにテキスト情報の情報概要を生成することです。一部のソフトウェア ダウンロード サイトのソフトウェア情報で MD5 値がよく見られますが、その機能は、ソフトウェアをダウンロードした後、特別なソフトウェア (Windows MD5 Check など) を使用して、ダウンロードしたファイルに対して MD5 を実行できることです。サイトから提供されているファイルと同じファイルを取得できるようにするためです。

デジタル証明書

第三者の認証局がある場合、MD5 を使用すると、文書の作成者の「否認」、いわゆるデジタル署名アプリケーションを防ぐこともできます。

安全なアクセス認証

Unix システムでは、ユーザーのパスワードは、MD5 (または他の同様のアルゴリズム) によるハッシュ操作の後にファイル システムに保存されます。ユーザーがログインすると、システムはユーザーが入力したパスワードに対して MD5 ハッシュ操作を実行し、それをファイル システムに保存されている MD5 値と比較して、入力されたパスワードが正しいかどうかを判断します。このような手順を通じて、システムはユーザーのパスワードのクリア コー​​ドを知らなくても、ユーザーのログイン システムの正当性を判断できます。

3.2 SHAアルゴリズムとそのリビジョン

セキュア ハッシュ アルゴリズム (英語: Secure Hash Algorithm、略称 SHA) は、デジタル メッセージに対応する固定長の文字列 (メッセージ ダイジェストとも呼ばれる) を計算できる暗号化ハッシュ関数のファミリーです。

また、入力メッセージが異なる場合、それらは異なる文字列に対応する可能性が高くなります。SHA ファミリ アルゴリズムは、SHA-0、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA3 です。

SHA-224、SHA-256、SHA-384、および SHA-512 は、SHA-2 と呼ばれることもあります。SHA3 は、以前は Keccak アルゴリズムとして知られていた第 3 世代のセキュア ハッシュ アルゴリズム (セキュア ハッシュ アルゴリズム 3) です。ハードウェアに実装されているため、このアルゴリズムは他のアルゴリズムよりも明らかに高速ですが、現在、SHA-0 と SHA-1 はクラックされています。

3.2.1 主な目的

私たちはハッシュ キーの生成に SHA-256 をよく使用しますが、これは暗号化における「中間法」の究極の具体化でもあります。さらに、SHA アルゴリズムの主な目的は、データの信頼性と整合性を検証するための安全な方法を提供することです。 。SHA アルゴリズムは、次のようなさまざまなアプリケーションで使用されます。

  • デジタル署名: SHA アルゴリズムは、メッセージまたはドキュメントの信頼性を検証するために使用できるデジタル署名の作成に使用されます。
  • データの整合性検証: SHA アルゴリズムを使用すると、データのハッシュ値を既知のハッシュ値と比較することで、データの整合性を検証できます。
  • パスワードのハッシュ: SHA アルゴリズムを使用してパスワードをハッシュできるため、攻撃者によるパスワードの解読が困難になります。
  • ファイル検証: SHA アルゴリズムを使用すると、ファイルのハッシュ値を既知のハッシュ値と比較することで、ファイルの整合性を検証できます。

3.2.2 コア実装

MD5 と同様に、Java のMessageDigest クラスも SHA アルゴリズムの組み込み実装を提供します。以下は、Java で SHA-256 アルゴリズムを実装する例です。

import java.security.MessageDigest;

public class SHA {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 创建一个消息摘要对象
        MessageDigest digest = MessageDigest.getInstance("SHA-256");

        // 将要计算的文本转换为字节数组
        byte[] data = "Hello, world!".getBytes();

        // 更新消息摘要对象内的数据体
        digest.update(data);

        // 计算得到摘要结果
        byte[] digestValue = digest.digest();

        // 将摘要结果转换为64位的hex数字文本
        String hexString = new String(digestValue, "UTF-8");

        // 将输出 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
        System.out.println(hexString);
    }
}

MessageDigest クラスに加えて、次のような SHA アルゴリズムの Java 実装が他にもいくつかあります。

  • 弾む城
  • Apache Commons コーデック Apache Commons
  • グーグルグアバ

これらの実装は、さまざまなハッシュ アルゴリズムのサポートやデータ ストリームの SHA ハッシュの生成などの追加機能を提供します。

Java の SHA アルゴリズムの最も広く使用されている実装は、MessageDigest クラスです。これは最も基本的で簡単な実装であり、標準の Java ディストリビューションに含まれています。

4. データベアコーディング

ネイキッド コーディングは、コンピューターにおける非常に一般的なデータ処理方法です。定義の観点からは、一定のルールに従ってバイナリデータの完全性を失わずにエンコード後に元のデータを取得できるすべての方式をデータネイキッドエンコーディングと呼びます。

実際のアプリケーションで最もよく使われるのは、HEXエンコードとBase64エンコードです。

4.1 HEXエンコーディング

HEX エンコーディングは実際には一種のネイキッド エンコーディングであり、目的はバイナリ配列をbyte[]人間が判読できる文字列の共通アルゴリズムに変換することです。

その原理は非常にシンプルです。

16 進エンコードは、バイナリ データの各バイトを 2 つの 16 進数に変換することによって機能します。16 進数は、0 ~ 9 の数字と A ~ F の文字です。各 16 進数は 4 ビットのバイナリ データを表すことができます。したがって、2 つの 16 進数で 8 ビットのバイナリ データを表すことができ、これは 1 バイトに相当します。

たとえば、バイナリ データ 10101010 は 16 進数 A2 としてエンコードされます。最初の 16 進数の A は 4 桁の 1010 を表します。2 番目の 16 進数 2 は、4 桁の 1010 を表します。

4.2 Base64 エンコード

Base64 は、バイナリ データを印刷可能な文字列として表現する方法です。これは、HTTP や SMTP などのテキストを転送するように設計されたプロトコルを介してバイナリ データを転送するために一般的に使用されます。

Base64 エンコードは、3 バイトのバイナリ データの各グループを 4 文字のテキストに変換することによって機能します。これらの文字は、0 ~ 9 の数字、A ~ Z、文字 + および / を含む 64 文字のセットから選択されます。

たとえば、バイナリ データ 10101010 は文字 A2 としてエンコードされます。最初の 2 文字 A と 2 は、バイナリ データの最初の 2 バイトを表します。3 番目の文字 + は、バイナリ データの 3 バイト目を表します。4 番目の文字 / は、エンコードされたデータを 4 文字の倍数にするために追加されるパディング文字です。

おすすめ

転載: blog.csdn.net/wybaby168/article/details/131247877