Шифрование Blowfish — зашифрованные в php и java, я получил разные зашифрованные значения

Данные теста шифрования:

key: 'ABC';
data:'1234567';
algorithm:  MCRYPT_BLOWFISH;
mode: MCRYPT_MODE_ECB;

Код PHP

$key  = 'ABC';
$data = '1234567';
$alg  = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_ECB;

$encrypted_data = mcrypt_encrypt($alg, $key, $data, $mode);

$phpgeneratedtoken  = base64_encode($encrypted_data);

print "PHP generated token: " . $phpgeneratedtoken."   ";
// return
// In6uDpDqt1g=

// Decode the token just generated by php

$decoded = mcrypt_decrypt($alg,$key,base64_decode("In6uDpDqt1g="),$mode);
print "Decoded from php generated token:" . $decoded."    ";

//return
//1234567

// This is the encrypted token generated by java with same key and value
$javageneratedtoken  = "Cg8qY4gRMaI=";

// Decode the token generated by Java
$decoded = mcrypt_decrypt($alg,$key,base64_decode("Cg8qY4gRMaI="),$mode);
print "Decoded from Java Generated token: " . $decoded."    ";
// return
// 1234567

// Both tokens generated by java and php, are decrypted back to the same value.

Java-код:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class BlowfishTest {

public static void main(String[] args) throws Exception {
encrypt("1234567");
decrypt("In6uDpDqt1g=");
}

private static void encrypt(String password) throws Exception {
byte[] keyData = ("ABC").getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyData, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] hasil = cipher.doFinal(password.getBytes());
System.out.println(new BASE64Encoder().encode(hasil));
}

private static void decrypt(String string) throws Exception {
byte[] keyData = ("ABC").getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyData, "Blowfish");
Cipher cipher = Cipher.getInstance("blowfish/ecb/nopadding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] hasil = cipher.doFinal(new BASE64Decoder().decodeBuffer(string));
System.out.println(new String(hasil));
}
}

Сгенерированное PHP зашифрованное значение: In6uDpDqt1g=,

Сгенерированное Java зашифрованное значение: Cg8qY4gRMaI=,

Проблема в коде Java

Cipher cipher = Cipher.getInstance("blowfish");

Мне нужно найти способ сделать мое зашифрованное значение, сгенерированное PHP, таким же, как зашифрованное значение, сгенерированное Java.

Оба зашифрованных значения я могу расшифровать обратно в PHP. Оба зашифрованных значения я мог бы расшифровать их обратно в Java, ТОЛЬКО ЕСЛИ я установил,

Cipher cipher = Cipher.getInstance("blowfish/ecb/nopadding");

Но когда я пытаюсь расшифровать зашифрованное значение PHP, In6uDpDqt1g=в Java.

Если я установлю,

Cipher cipher = Cipher.getInstance("blowfish");

Я получил ошибку:

Msgstr «Данный последний блок не заполнен должным образом».

Проблема в том, что я должен использовать PHP для шифрования значения, а мой клиент будет использовать Java для расшифровки значения. С настройкой Cipher cipher = Cipher.getInstance("blowfish") расшифровать мою ценность.

Поэтому я хочу найти способ использовать PHP для получения того же зашифрованного значения, что и Java, с Cipher cipher = Cipher.getInstance("Blowfish"), мог получить.

Если такого решения не существует, я должен был бы попросить моего клиента изменить его Java-коды для использования

Cipher cipher = Cipher.getInstance("blowfish/ecb/nopadding");

0

Решение

ОК, я нахожу свой ответ. Мне нужно изменить свой PHP-код на

$key  = 'ABC';
$data = '1234567';
$alg  = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_ECB;

$blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length
$data.= str_repeat(chr($pkcs), $pkcs);

$encrypted_data = mcrypt_encrypt($alg, $key, $data, $mode);

$phpgeneratedtoken  = base64_encode($encrypted_data);

print "PHP generated token: " . $phpgeneratedtoken."   ";
// return
// Cg8qY4gRMaI=
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]