Oracle実装に関するさらに愚かなことの1つは、SecretKeyFactory
が「2キー」DESキーとも呼ばれるDES ABAキーをサポートしていないことです。
トリプルDES操作のこれらのキーは、単一のDESキーAとそれに続く単一のDESキーBで構成されます。キーAは、DES EDE(暗号化 - 復号化 - 暗号化)内のDESの最初と最後の繰り返しの両方に使用されます。
ソフトウェア内にいる場合は、そのようなキーを作成する方法を作成できます。問題は結果として得られるキーが実際には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が実際にその暗号化に使用されたことを知りました。暗号化されたデータを暗号化する際にAESを使用することは可能ですか? –