this answer에 샘플 코드를 사용하여 Java로 암호화/암호 해독 프로토 타입을 작성했습니다. 그러나 AES의 카운터 모드 (CTR)로 재생하려고하는데 암호화 된 값은 암호화하려는 정수 시퀀스만큼 증가하는 것처럼 보입니다. enc
값은 보통 한 자릿수로 dec
값과 어떻게 다른지Java AES 카운터 모드 증분
i = 0: enc='5941F8', dec='000', length=6
i = 1: enc='5941F9', dec='001', length=6
i = 2: enc='5941FA', dec='002', length=6
i = 3: enc='5941FB', dec='003', length=6
i = 4: enc='5941FC', dec='004', length=6
i = 5: enc='5941FD', dec='005', length=6
i = 6: enc='5941FE', dec='006', length=6
i = 7: enc='5941FF', dec='007', length=6
i = 8: enc='5941F0', dec='008', length=6
i = 9: enc='5941F1', dec='009', length=6
i = 10: enc='5940F8', dec='010', length=6
i = 11: enc='5940F9', dec='011', length=6
i = 12: enc='5940FA', dec='012', length=6
주의 사항 :
내 프로토 타입의 다음과 같은 출력을 고려하십시오. AES의 카운터 모드에서 생성 된 암호화 된 값은 일반적으로이 반복 가능/서로 비슷하거나 잘못된 것입니까?
지금까지 다른 암호화 키, 초기화 벡터, 패딩 스키마, 다른 값에서 시작하는 더 길거나/더 짧은 정수 시퀀스 등을 사용해 보았습니다.하지만 지금까지는 아무 것도 작동하지 않는 것 같습니다. 또한 카운터 모드의 Java AES 암호에 대한 Google 및 기타 문의 사항은 지금까지 거의 사용되지 않았습니다. 내가 암호 초보자라는 것을 명심하십시오. 다음과 같이 내 프로토 타입
코드는 다음과 같습니다
public class Encryptor {
public static String encrypt(String key, String initVector, String value) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return DatatypeConverter.printHexBinary(encrypted);
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static String decrypt(String key, String initVector, String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] decrypted = cipher.doFinal(DatatypeConverter.parseHexBinary(encrypted));
return new String(decrypted);
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String key = "Bar12345Bar12345"; // 128 bit key
String initVector = "RandomInitVector"; // 16 bytes IV
System.out.println(decrypt(key, initVector,
encrypt(key, initVector, "Hello World")));
for (int i = 0; i < 1000; ++i) {
String encrypted = encrypt(key, initVector, StringUtils.leftPad("" + i, 3, '0'));
String decrypted = decrypt(key, initVector, encrypted);
int encLen = encrypted.length();
System.out.println("i = " + i + ": enc='" + encrypted + "', dec='" + decrypted + "', length=" + encLen);
}
}
}
흥미롭게도, 나는 당신이 연결하고있는 대답을 downvoted. 너도 그래야 해. CBC 모드에서 동일한 IV를 사용하는 것은 문제이지만 CTR 모드에서는 더 큰 문제이므로 질문하십시오. –
당신이이 질문을하지 못하도록 막아야하는 링크 된 대답 아래에 내 의견을 기록하십시오. 나는해야 할 일을 충분히 분명히하지 않았는가? –
아니, 대답은 괜찮 았어. 당신의 충고를 받았을 때 나는 더 나은 데이터를 얻었습니다. 그러나 당신의 대답은 흥미로운 결과 문제를 야기합니다. 답에 대한 아래의 주석을보십시오. – entpnerd