2013-08-28 3 views
1

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"); 

답변

0

결국 암호화가 아닙니다.

문제는 BASE64 인코딩과 사실로 +를 공간으로 변형시킨 방식으로 쿠키를 통해 이동했기 때문에 (바이트 단위로 조언 해 주셔서 감사합니다).

0

: 여기에 단지의 블록 별 특성을 표시하지 않고, 같은 문제를 전시 원래의 코드는 , 당신은 문자 집합을 지정하지 않습니다). 모든 바이트를 모아서 문자열로 변환하고 "UTF-8" charset을 지정해야합니다.

+0

나는 틀린 동일한 동일한 특성을 표시 한 나의 본래 doFinal()에는 지정된 부호 매김이 있었다는 것을 고맙게 여긴다. 그러나이 경우 모든 원래 문자는 128보다 낮습니다. 그러므로 나는 그것이 그 문제라고 믿지 않는다. –

0

Java는 일반적으로 C#과 다른 기본값을가집니다. 따라서 기본값과 바이트와 문자열을 변환 할 때 특히 기본값에 의존해서는 안됩니다. 확인 자보다 오히려

System.out.println(new String(decryptedBytes, "UTF-8")); 

당신은 : 당신이 당신의 C# 코드에서와 마찬가지로뿐만 아니라 임의의 지점에서 UTF-8 문자열을 깨는 약 @ jtahlborn의 주석으로, 당신은 또한, 자바 코드에서 UTF-8로 지정해야 실제 바이트를 확인하려고 할 수 있습니다. 어떤 경우에는 불일치가 발생하는 곳을 더 잘 처리 할 수 ​​있습니다.

관련 문제