오라클 구현에 대해 바보 같은 점은 SecretKeyFactory
이 "2 키"DES 키라고도하는 DES ABA 키를 지원하지 않는다는 것입니다.
트리플 DES 조작을위한 이러한 키는 하나의 DES 키 A와 하나의 DES 키 B로 구성됩니다. 키 A는 DES EDE (DES)에서 DES의 첫 x 째 W 마지막 반복 모두에 사용됩니다.
소프트웨어 내에 있으면 이러한 키를 만드는 방법을 만들 수 있습니다. 문제는 결과 키가 실제로 192 비트를 가지며 이는 단순히 정확하지 않다는 것입니다. 키 크기를 구별하는 것이 불가능합니다.
private static final byte[] ENCRYPTION_KEY = Hex.decode("448D3F076D8304036A55A3D7E0055A78");
private static final byte[] PLAINTEXT = Hex.decode("1234567890ABCDEFFEDCBA0987654321");
public static void main(String[] args) throws Exception {
SecretKey desABAKey = createDES_ABAKey(ENCRYPTION_KEY);
Cipher desEDE = Cipher.getInstance("DESede/CBC/NoPadding");
IvParameterSpec zeroIV = new IvParameterSpec(new byte[desEDE.getBlockSize()]);
desEDE.init(Cipher.ENCRYPT_MODE, desABAKey, zeroIV);
byte[] ciphertext = desEDE.doFinal(PLAINTEXT);
System.out.println(Hex.toHexString(ciphertext));
}
: 즉 CBC 암호화 (패딩, 제로 IV) 우리 잎 있도록
private static final int DES_KEY_SIZE_BYTES = 64/Byte.SIZE;
private static final int DES_ABA_KEY_SIZE_BYTES = 2 * DES_KEY_SIZE_BYTES;
private static final int DES_ABC_KEY_SIZE_BYTES = 3 * DES_KEY_SIZE_BYTES;
public static SecretKey createDES_ABAKey(byte[] key) {
if (key.length != DES_ABA_KEY_SIZE_BYTES) {
throw new IllegalArgumentException("128 bit key argument with size expected (including parity bits.)");
}
try {
byte[] desABCKey = new byte[DES_ABC_KEY_SIZE_BYTES];
System.arraycopy(key, 0, desABCKey, 0, DES_ABA_KEY_SIZE_BYTES);
System.arraycopy(key, 0, desABCKey, DES_ABA_KEY_SIZE_BYTES, DES_KEY_SIZE_BYTES);
SecretKeySpec spec = new SecretKeySpec(desABCKey, "DESede");
SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
SecretKey desKey = factory.generateSecret(spec);
return desKey;
} catch (GeneralSecurityException e) {
throw new RuntimeException("DES-EDE ABC key factory not functioning correctly", e);
}
}
OK :
어쨌든, 다음 코드는 DES의 ABA 키를 생성하는 데 사용할 수 있습니다
Bouncy Castle 16 진수 코덱을 사용했지만 다른 16 진수 코덱을 사용할 수도 있습니다.
3DES는 168 비트입니다. 때때로 키의 일부가 재사용되어 112 비트가됩니다. 차이점은 바이트 당 MS 7 비트 만 사용되므로 LS 비트는 처음에는 패리티에 사용되지만 일반적으로 현재 사용에서는 무시됩니다. 그러나 DES와 3DES는 새로운 작업에 사용해서는 안되며 대신 DES를 대체하는 AES를 사용하십시오. 패딩이 사용되지 않으면 입력 데이터는 항상 블록 크기의 배수 여야하며 DES의 경우 8 바이트 여야하며 PKCS # 5 패딩이 일반적으로 사용됩니다. – zaph
테스트 데이터에 따르면 DUKPT 키에 대해 언급하는 것이 좋습니다.이것은 꽤 관련된 과정입니다. 나는 [이 블로그] (https://www.parthenonsoftware.com/blog/how-to-decrypt-magnetic-stripe-scanner-data-with-dukpt/)에서 많은 도움을 발견했습니다. 그것을 구현. –
@zaph하지만 암호화 과정에서 3DES가 실제로 암호화에 사용되었음을 알게되었습니다. 암호화 된 데이터를 3DES로 해독 할 때 AES를 사용할 수 있다는 것을 의미합니까? –