C#에서 암호화 된 Java 바이트의 암호 해독 문제가 있습니다.일부 블록의 오류가 Java 암호 해독에서 반환되었습니다.
Java의 출력물은 다섯 개의 일반 텍스트 블록 중 마지막 두 개에서 실수를합니다. 블록 4는 완전히 잘못되었으며 블록 5에는 단일 문자 오류가 있습니다.
것들 내가 두 번 확인/언급했습니다
- 내가 24을 만들 끝에 16 비트 C 번호 키의 첫 번째 바이트를 반복했다 있지만 키와 IV를가 동일 비트 자바 키.
- C#은 CBC와 PKCS7을 사용합니다. 블록 크기는 8입니다.
- Java는 CBC와 PKCS5 (이 목적으로 7과 같음)를 사용하고 있습니다. 여기
내가 SYS 아웃에 일반 텍스트 블록을 볼 것으로 예상하고 있습니다
byte[] inputByteArray = Base64.decode(val);
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(byKey, "DESede"), new IvParameterSpec(iv, 0, 8));
byte[] decryptedBytes;
for (int i = 0, j = 0; i < inputByteArray.length; i++) {
if ((decryptedBytes = c.update(inputByteArray, i, 1)) == null)
continue;
else {
System.out.println(new String(decryptedBytes));
j += decryptedBytes.length;
}
}
자바
에서 C#을byKey = Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(val);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
그리고 해독의 암호화 측면이다. .update() 루프를 .doFinal()으로 대체 할 수 있지만 블록 단위로보고 싶었습니다.
저는 Java에 익숙하지 않아서 특별히 제안 해 주시면 감사하겠습니다.
텍스트 인코딩이 문제가 있다고 생각하지 않습니다. 당신은 UTF-8 바이트의 임의의 덩어리를 가지고도 (문자열로 변환 할 수 없습니다
byte[] decrypted = c.doFinal(inputByteArray);
return new String(decrypted, "UTF-8");
나는 틀린 동일한 동일한 특성을 표시 한 나의 본래 doFinal()에는 지정된 부호 매김이 있었다는 것을 고맙게 여긴다. 그러나이 경우 모든 원래 문자는 128보다 낮습니다. 그러므로 나는 그것이 그 문제라고 믿지 않는다. –