SHAアルゴリズムの原理と一般的な実装

この記事を読む前に、MD5アルゴリズムの以前の紹介を確認することをお勧めします。
MD5アルゴリズムの原則と一般的な実装

定義

SHAアルゴリズム(Secure Hash Algorithm)、別名セキュアハッシュアルゴリズム。
SHAアルゴリズムはMD4アルゴリズムに基づいており、進化しています。
しかし、SHAアルゴリズムは国家安全保障局によって生まれ、設計されました。
SHAアルゴリズムは、SHA-1およびSHA-2(SHA-224、SHA-256、SHA-384、SHA-512)を含む一連のファミリーです。括弧内の4つは一般にSHA-2と呼ばれます。
JDKはSHA-1、SHA-256、SHA-384、およびSHA-512を実装します。
SHA-1の最終的なパスワードの長さは160ビットです。
SHA-256の最終的なパスワードの長さは256ビットです。
SHA-384の最終的なパスワードの長さは384ビットです。
SHA-512の最終的なパスワードの長さは512ビットです。
SHAアルゴリズムは、実際にはMDアルゴリズムに類似したメッセージダイジェストアルゴリズムです。

この記事では主にSHA-256アルゴリズムを紹介します。
任意の長さのメッセージファイルはSHA-256アルゴリズムで暗号化され、結果の暗号文は256ビット(32バイト)で、通常は長さが64の16進数文字列で表されます。

実際、SHAアルゴリズムはMD5アルゴリズムに似ており、主な機能は元に戻せません。

MD5とSHA-1の衝突問題

衝突の問題とは、アルゴリズムの場合、平文から生成された暗号文は一意ではなく、新しい暗号文でさえ、指定された暗号文を取得するために人為的に構築できることを指します。このような状況で発生する可能性のあるアルゴリズムについては、このアルゴリズムには衝突の問題があると言いますが、簡単に理解すると、2つの異なる平文はアルゴリズムによって暗号化されますが、同じ暗号文が取得されます。

これまでのところ、MD5アルゴリズムとSHA-1アルゴリズムには衝突の問題があることが確認されています。
したがって、特にセキュリティが高いシナリオでは、MD5アルゴリズムとSHA-1アルゴリズムは使用されず、少なくともSHA-256アルゴリズムが使用されます。

一般的なアプリケーションシナリオ

1. MD5に類似したアプリケーションシナリオ

MD5アプリケーションシナリオでは、SHAアルゴリズムを基本的に使用できます。

2.ビットコイン

ビットコインでは、マイニングアルゴリズムは実際にはSHA-256アルゴリズムであり、マイナーは常に乱数を変更し、常にSHA-256操作を実行して、最終的にマイニング速度を計算します。

3. https署名アルゴリズムが使用されます

ブラウザを開き、Googleを例にとって整数の詳細を表示します。
署名アルゴリズムは次のとおり、RSA暗号化を使用したSHA-256です。
ここに画像の説明を挿入

SHA-256アルゴリズムの原理

SHAファミリの基本的なアルゴリズムの考え方は、MD5の考え方と同じです。まず定数を定義してからループを計算し、最後にアセンブルします。違いは、ループ内の計算方法です。

1.情報を入力します

MD5に類似

2.初期値を取得する

MD5には4つの初期値があり、SHA-256には8つの初期値があります。

h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

3.実際の計算

計算は複数のサイクルに分割されます。各サイクルには、最初のステップでABCDと元のテキストが入力された情報が入力されます。計算が実行され、最後に新しいABCDが取得されます。最後に、最後のABCDが文字列にスペルされます。これが最終的な暗号文です。
ループは最初にメインループに分割され、各メインループはサブループで設定されます。
メインループの数=元のテキストの長さ/ 512。
サブサイクルの数= 64回。

単一のサブループの機能を見てみましょう
。以下は、単一のサブループの実際の計算ロジックです(この実装はネチズンから取得しています)。
ここに画像の説明を挿入

Javaの実装と使用

実際、以前のMD5​​の紹介を読んだ後、SHAのJava実装はMD5のJava実装とほとんど同じであることがわかります。
唯一の違いはMessageDigest.getInstance( "SHA")です。このメソッド
では、SHA-1アルゴリズム

入力パラメーターはSHA-256です。SHAアルゴリズムの入力パラメーターはSHA-256です。SHA-384アルゴリズム入力パラメーターはSHA-384
SHAです。 -512アルゴリズム入力パラメーターはSHA-512
MD5入力パラメーターはMD5

public class SHA1Util {
    public static void main(String[] args) throws IOException {
        System.out.println(encodeString("123"));
    }

    public static String encodeString(String plainText) throws UnsupportedEncodingException {
        return encodeBytes(plainText.getBytes("UTF-8"));
    }

    public static String encodeBytes(byte[] bytes) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(bytes);
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}

元の記事203件を公開 賞賛された186件 210,000回

おすすめ

転載: blog.csdn.net/java_zhangshuai/article/details/105590847