-1

以下のC#コードをJavaに変換する必要がありますが、C#のRfc2898DerivedBytesおよびRijndaelに相当するJavaは見つかりませんでした。

    private static string Encrypt(string sData, string sEncryptionKey)
{
    string str = null;
    string str2;
    try
    {
        Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(sEncryptionKey, 8);
        Rijndael rijndael = Rijndael.Create();
        rijndael.IV = bytes.GetBytes(rijndael.BlockSize / 8);
        rijndael.Key = bytes.GetBytes(rijndael.KeySize / 8);
        byte[] buffer = Encoding.Unicode.GetBytes(sData);
        using (MemoryStream stream = new MemoryStream())
        {
            using (CryptoStream stream2 = new CryptoStream(stream, rijndael.CreateEncryptor(), CryptoStreamMode.Write))
            {
                stream.Write(bytes.Salt, 0, bytes.Salt.Length);
                stream2.Write(buffer, 0, buffer.Length);
                stream2.Close();
                str = Convert.ToBase64String(stream.ToArray());
                str2 = str;
            }
        }
    }
    catch (Exception exception)
    {
       System.out.println(exception.getMessage());
    }
    return str2;

}

[アップデート]

この関数を使用して、新しく作成されたユーザーのパスワードを暗号化する必要があります。暗号化されたパスワードは、C#を含む他の呼び出し元によっても正しく復号化される必要があります。

コメントと回答に記載されているドキュメントに従い、すぐに確認できるように、以下にサンプルを書いてみます。

public class testEncrypt {
public static void main(String[] args) throws Exception {

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

    char[] password = "passkey".toCharArray();

    SecureRandom random = new SecureRandom();
    byte[] salt = new byte[8];
    random.nextBytes(salt);

    KeySpec spec = new PBEKeySpec(password, salt, 1000, 256); 
    SecretKey tmp = factory.generateSecret(spec);
    SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secret);
    AlgorithmParameters params = cipher.getParameters();
    byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
    byte[] ciphertext = cipher.doFinal("301a7fed-54e4-4ae2-9b4d-6db057f75c91".getBytes("UTF-8"));

    System.out.println(ciphertext.length);

}

}

ただし、暗号文の長さは48ですが、実際にはC#ではこの形式のように見えます

WHUNV5xrsfETEiCwcT0M731 + Ak1jibsWEodJSaBraP1cmmkS1TpGWqwt / 6p / a7oy8Yq30ImZPbFF + Y0JNLa3Eu2UGuazZtuhEepUIIdaDEtA2FO0JYIj2A ==

合計120文字。

コードに何か問題がありますか?

4

1 に答える 1

5

RFC2898は、PBKDF2(パスワードベースの鍵導出関数)の正式名称です。

この質問はSecretKeyFactoryPBKDF2のクラスを使用しているようです。

JavaでのPBKDF2によるパスワード検証

満足のいく実装が見つからない場合は、BouncyCastleのいくつかのクラス(C#の場合、ただしJavaの場合は機能するはずです)を使用してアルゴリズムを作成した私の質問を参照することをお勧めします。Rfc2898DeriveBytes.NET Compact Frameworkがなかったため、C#用にこれを作成する必要がありました。

この質問は間違いなくあなたにも役立つはずです!

また、同じ問題に遭遇した誰かによって行われた実装をここで見つけることができます。

また、あなたの質問の2番目の部分に答えるために、

RijndaelはAESと大差ありません。このウェブページを引用するには

つまり、Rijndaelでは、{128、160、192、224、256}ビットのセットから独立してキーサイズとブロックサイズの両方を選択できます。(そして、キーサイズは実際にはブロックサイズと一致する必要はありません)。ただし、FIPS-197では、ブロックサイズはAESでは常に128ビットである必要があり、キーサイズは128、192、または256ビットのいずれかであると指定されています。

Rijndaelアルゴリズムは、NISTによってAdvancedEncryptionアルゴリズムとして選択されました。

したがって、JavaでAESアルゴリズムを使用できます。

于 2012-07-28T04:38:04.740 に答える