Salı, Ocak 18, 2011

php'de MCRYPT_3DES ve MCRYPT_MODE_CBC ile şifrelemenin java'daki karşılığı

php'de TripleDES şifreleme algoritması ile CBC mod kullanarak ürettiğiniz şifrelenmiş sözcüğün aynısını java'da üretmek için internette arandığınızda karşınıza iki anahtar sözcük çıkacaktır:

  • DESede (algoritma olarak)
  • DESede/CBC/PKCS5Padding (dönüşüm metodu)
burada yanıltıcı olan dönüşüm metodu, php "PKCS5Padding" desteklemediğinden şifrelemek için verdiğiniz sözcüğün sonuna, kendince, 8'in katı kadar karakter sayılı hale getirecek şekilde boş karakterler ekliyor. Dolayısıyla java'da da dönüşüm metodu olarak "DESede/CBC/NoPadding" kullanıp, eksik karakter hatası[1] almamak için de php'nin yaptığını elle yapmanız gerekli.

aşağıdaki şifreleme için kullanılan php kodunun java karşılığını daha da aşağısında bulabilirsiniz.

PHP:

$plaintext = "Some-plain-text-message-to-be-symetrically-encrypted";
$deskey = "secret word with 24 byte";
$ivkey = "12345678";
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $deskey, $ivkey);
$encrypted_data = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
echo strtoupper(bin2hex($encrypted_data));
mcrypt_module_close($td);


JAVA:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Hex;
import java.util.Date;
import java.util.Arrays;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;

public class Encrypt {

public static void main(String[] args) throws Exception {
String plainText = "Some-plain-text-message-to-be-symetrically-encrypted";
String desKey = "secret word with 24 byte";
String ivKey = "12345678";
String algorithm = "DESede";
// String transformation = "DESede/CBC/PKCS5Padding";
String transformation = "DESede/CBC/NoPadding";
byte[] keyValue = desKey.getBytes("UTF-8");
byte[] ivValue = ivKey.getBytes("UTF-8");
DESedeKeySpec keySpec = new DESedeKeySpec(keyValue);
IvParameterSpec iv = new IvParameterSpec(ivValue);
SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);
Cipher encrypter = Cipher.getInstance(transformation);
encrypter.init(Cipher.ENCRYPT_MODE, key, iv);
// byte[] input = plainText.getBytes();
byte[] input = getPaddedBytes(plainText);
byte[] encrypted = encrypter.doFinal(input);
System.out.println(new String(Hex.encodeHex(encrypted)).toUpperCase());
}

public static byte[] getPaddedBytes(String s) throws java.io.UnsupportedEncodingException {
int n = s.length();
n = n + (8 - (n % 8));
byte[] src = s.getBytes("UTF-8");
byte[] dst = Arrays.copyOf(src, n);
return src;
}
}



[1] javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes

2 yorum:

  1. Harika bir bilgi, teşekkür ederim !

    YanıtlaSil
  2. bu ne ya php de 2 satır javada 12 satır
    Rumuz : borsacı evo

    YanıtlaSil