以下の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文字。
コードに何か問題がありますか?