1
package abc.xyz;
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class SHA2{ 

    private static String convertToHex(byte[] data) { 
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) { 
            int halfbyte = (data[i] >>> 4) & 0x0F;
            int two_halfs = 0;
            do { 
                if ((0 <= halfbyte) && (halfbyte <= 9)) 
                    buf.append((char) ('0' + halfbyte));
                else 
                    buf.append((char) ('a' + (halfbyte - 10)));
                halfbyte = data[i] & 0x0F;
            } while(two_halfs++ < 1);
        } 
        return buf.toString();
    }      
public static String SHA2(String text) 
            throws NoSuchAlgorithmException, UnsupportedEncodingException  { 

        MessageDigest mesd;
        mesd = MessageDigest.getInstance("SHA-2");
        byte[] sha2hash = new byte[40];
        mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
        sha2hash = mesd.digest();//error
        return convertToHex(sha2hash);
    } }

digest(); の実装でエラーが発生しました。

4

4 に答える 4

4

SHA-2はそれ自体がアルゴリズムではありません。ウィキペディア:

SHA-2は、暗号化ハッシュ関数のセットです(SHA-224、SHA-256、SHA-384、SHA-512)

SHA-224以外はすべて利用できるはずだと思います。

public static String SHA2(String text) 
    throws NoSuchAlgorithmException, UnsupportedEncodingException  { 

  MessageDigest mesd = MessageDigest.getInstance("SHA-256");
  byte[] bytes = text.getBytes("iso-8859-1");
  mesd.update(bytes, 0, bytes.length);
  byte[] sha2hash = mesd.digest();
  return convertToHex(sha2hash);
} 

さらに、作成するバイト配列は必要ありません。このdigest()メソッドは配列自体を返します。代入演算子は、結果を既存の配列に書き込むことはありません。もちろんインデックスを指定しない限り。

もう一つ。text.length()update(..)は、結果のバイト配列の長さと必ずしも同じではないため、呼び出すときに使用しません。これは主に、UTF-8のようなマルチバイト文字エンコーディングの場合です。選択した戦略によっては、マッピングできないキャラクターでも発生する可能性があります。さて、要点は、しかし、あなたは私が何について話しているのかを知る必要はないということです。代わりに配列を使用.lengthして保存してください:)

于 2011-01-21T09:21:29.160 に答える
2

使用するSHA-2バリアント (SHA-256 または SHA-512)を指定する必要があります。それらをダイジェスト名として使用します。

于 2011-01-21T09:20:24.553 に答える
2

まだお読みでない場合は、JCA に関する SUN ドキュメント、特にMessageDigestを読むことをお勧めします。デフォルトのSUN プロバイダーを見ると、実際には SHA-2 が存在しないことがわかります。おそらく、代わりに「SHA-512」を試してください。

試す:

String message = "Some Message";

MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");

messageDigest.update(message.getBytes("UTF-16BE"));
byte[] digest = messageDigest.digest();

StringBuffer digestInHex = new StringBuffer();

for (int i = 0, l = digest.length; i < l; i++) {
    // Preserve the bit representation when casting to integer.
    int intRep = digest[i] & 0xFF;
    // Add leading zero if value is less than 0x10.
    if (intRep < 0x10)  digestInHex.append('\u0030');
    // Convert value to hex.
    digestInHex.append(Integer.toHexString(intRep));
}

System.out.println(digestInHex.toString());
于 2011-01-21T09:26:23.140 に答える
1

どのようなエラーですか?「sha1hashを解決できません」?変数を宣言できませんでした。eclipseでctrl-1を押すと仕事ができます。sha2hashはどうですか?そのような変数は1つだけである必要があります。テキストとテキスト文字列はどうですか?別の自己混乱?

ところで、「SHA-2」のようなものはありません。これは、SHA-256などを含む関数のファミリーです。したがって、次のようなものを試してください。

public static byte[] sha2(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    final MessageDigest mesd = MessageDigest.getInstance("SHA-256");
    mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
    return mesd.digest();
}
于 2011-01-21T09:21:42.583 に答える