Cipher / 3DES / CFB / Java and PHP
Asked Answered
A

1

6

I have a PHP servor which decrypt data in 3DES with the CFB Mode

I encrypt in PHP :

$montant = "500";
$message_crypte = mcrypt_encrypt(MCRYPT_3DES, "N4y1FRDRJ7wn7eJNnWaahCIS", $montant, ,CRYPT_MODE_CFB, "NCNPJDcR");
$montant = base64_encode($message_crypte);

This script in PHP is OK with other system.

And I want to encrypt in Java :

public class CryptData {
    private KeySpec keySpec;
    private SecretKey key;
    private IvParameterSpec iv;

    public CryptData(String keyString, String ivString) {
        try {
            final MessageDigest md = MessageDigest.getInstance("md5");

            final byte[] digestOfPassword = md.digest(Base64
                    .decodeBase64(keyString.getBytes("ISO-8859-1")));

            final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
            for (int j = 0, k = 16; j < 8;) {
                keyBytes[k++] = keyBytes[j++];
            }

            //keySpec = new DESedeKeySpec(keyBytes);
            keySpec = new DESedeKeySpec(keyString.getBytes());

            key = SecretKeyFactory.getInstance("DESede")
                    .generateSecret(keySpec);

            iv = new IvParameterSpec(ivString.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String encrypt(String value) {
        try {
            Cipher ecipher = Cipher.getInstance("DESede/CFB/NoPadding");

                    //"SunJCE");
            ecipher.init(Cipher.ENCRYPT_MODE, key, iv);

            if (value == null)
                return null;

            // Encode the string into bytes using utf-8
            byte[] valeur = value.getBytes("ISO-8859-1");
            //byte[] utf8 = value.getBytes();

            // Encrypt
            byte[] enc = ecipher.doFinal(valeur);

            // Encode bytes to base64 to get a string
            return new String(Base64.encodeBase64(enc), "ISO-8859-1");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

I have not the same result in PHP and in Java

How modify Java treatment to obtain the same result as PHP?

Abductor answered 12/6, 2012 at 8:55 Comment(8)
It looks like your PHP isn't performing any PKCS#5 padding -- was that just omitted from your sample here or is there no padding being performed on the PHP side?Natalya
My PHP script is already working with other sites in PHP or ASP or C #, so I would not change the code, but rather in Java. Do you have an idea? I tested with NoPadding, but it does not work either ...Abductor
This might just be me, but to me it looks like you aren't base64 encoding in the PHP script, so if you decode it at the other end, it will be read as pure gibberish?Exhaustive
I edit my post, and with PHP, I obtain : "N7IM" and with Java, I obtain "N5vL". I modify the padding, but it isn't good. Have you an idea ?Abductor
I have the solution !!!!! Cipher ecipher = Cipher.getInstance("DESede/CFB8/NoPadding"); .... I replace CFB by CFB8Abductor
@Abductor please answer the question so others could see we have a solution here.Co
The solution is "Cipher ecipher = Cipher.getInstance("DESede/CFB8/NoPadding");"... CFB8 !Abductor
@Abductor Choose the "Answer Your Question" link at the bottom of the page, post your response then select it as the answer. This will remove it from the unanswered page.Chancechancel
A
2

The answer is:

Cipher ecipher = Cipher.getInstance("DESede/CFB8/NoPadding");

I need to use "CFB8"

Abductor answered 6/8, 2012 at 9:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.