私は暗号化については非常に不慣れで、サーバーに確認する前にパスワードを暗号化することを任務としていました(私はそれが悪い習慣であることを知っていますが、従う必要があります)。これが私の暗号化方法です。
public static String encrypt(String src) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
Key key = makeKey();
AlgorithmParameterSpec iv = makeIv();
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return Base64.encodeBytes(cipher.doFinal(src.getBytes()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
static AlgorithmParameterSpec makeIv() {
return new IvParameterSpec(ENCRYPTION_IV.getBytes(encoding));
}
static Key makeKey() {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] key = md.digest(ENCRYPTION_KEY.getBytes(encoding));
return new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
ivが13文字の文字列で構成されている場合。私はパディングを指定しましたが、なぜ私はまだ得るのですか InvalidAlgorithmParameterException: IV must be 16 bytes long.
エラー?この暗号化方式を実際にどのように実装するのですか?
回答:
回答№1は1パディングは暗号化されているデータにのみ適用されます。 ほとんどの場合、データは暗号化している暗号化ブロックよりも少し長い/短いため、最後のブロックにはパディングが必要になります。
しかしあなたのIVは16バイトである必要があり、ゼロであなたのIVを埋め込むことはそうでなければセキュリティホールになるでしょう。