일부 암호화 된 데이터의 암호 해독을 수행하고 있습니다. 데이터가 매우 밀접한 정보라고 가정 해보십시오. 정보는 tripledes_cbc
알고리즘으로 암호화됩니다. 정보를 암호화하는 데 사용되는 비밀 키는 rsa
알고리즘으로 암호화됩니다.NoPadding 스키마로 tripledes_cbc 암호화 후 가비지 가져 오기
그러나 DESede/CBC/NoPadding
알고리즘으로 정보의 암호를 해독하려고하면 앞면과 뒷면에 패딩 된 일부 가비지 문자가있는 원본 데이터가 나타납니다.
DESede/CBC/NoPadding
대신 DES/CBC/PKCS5Padding
을 사용하려고하면 예외적으로 '최종 블록이 제대로 채워지지 않습니다.'라는 예외가 발생합니다.
다음은 코드 스 니펫입니다. 여분의 패딩이없는 정확한 텍스트를 얻으려면 어떻게해야하는지 알려주세요.
KeyStore ks = KeyStore.getInstance("jks");
FileInputStream fis = new FileInputStream(ksFile);
ks.load(fis, "testing".toCharArray());
PrivateKey privateKey = (PrivateKey) ks.getKey("keys", "1234".toCharArray());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] kekBytes = cipher.doFinal(Base64.decodeBase64(encKey.getBytes("UTF-8")));
SecureRandom random = new SecureRandom();
byte[] iv = new byte[8];
random.nextBytes(iv);
SecretKey key = new SecretKeySpec(kekBytes, "DESede");
Cipher cipher1 = Cipher.getInstance("DESede/CBC/NoPadding");
cipher1.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] out = cipher1.doFinal(Base64.decodeBase64(data.getBytes("UTF-8")));
System.out.println("Data Length: " + out.length);
String result = new String(out, "UTF-8");
1. 새 작업에는 3DES를 사용하면 안되며, AES는 현재 사용할 대칭 방법입니다. 하지만 제 생각에 이것은 학교 프로젝트이며 학교는 현실 세계의 10 년 정도 뒤입니다. 2. 예상 데이터와 해독 된 데이터의 예 **를 16 진수 형식으로 제공하십시오 **. – zaph
분명히 암호화 측에서 사용 된 패딩을 알아야합니다. 또한 DES 또는 DESede를 사용하고 있습니까? 왜냐하면'DES/CBC/PKCS5Padding'은'DESede/CBC/NoPadding'에 대한 합리적인 대안이 아니기 때문입니다. 아마도 당신은'DESede/CBC/PKCS5Padding'을 의미했을까요? –