首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >河豚加密-用php和java加密,我得到了不同的加密值。

河豚加密-用php和java加密,我得到了不同的加密值。
EN

Stack Overflow用户
提问于 2016-07-16 05:02:24
回答 1查看 1.3K关注 0票数 0

加密测试数据:

代码语言:javascript
复制
key: 'ABC';
data:'1234567';
algorithm:  MCRYPT_BLOWFISH;
mode: MCRYPT_MODE_ECB;

PHP代码

代码语言:javascript
复制
$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代码:

代码语言:javascript
复制
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));
    }
}

生成的加密值是: In6uDpDqt1g=

生成的加密值是: Cg8qY4gRMaI=

问题是在Java代码的

代码语言:javascript
复制
Cipher cipher = Cipher.getInstance("blowfish");

我需要找到一种方法,使我的PHP生成的加密值与生成的加密值相同。

这两个加密的值我可以在PHP中解密。这两个加密的值我也可以用java解密,只有当我设置,

代码语言:javascript
复制
Cipher cipher = Cipher.getInstance("blowfish/ecb/nopadding");

但是当我试图用Java解密PHP加密值In6uDpDqt1g=时。

如果我准备好,

代码语言:javascript
复制
Cipher cipher = Cipher.getInstance("blowfish");

我发现了一个错误:

“给出的最后一块没有适当地填充”。

问题是,我应该使用PHP加密值,而我的客户端将使用java解密值。使用安装Cipher cipher = Cipher.getInstance("blowfish")解密我的值。

因此,我想找到一种方法,可以使用PHP获取与Cipher cipher = Cipher.getInstance("Blowfish")相同的加密值。

如果没有这样的解决方案,那么我将不得不要求我的客户更改他的java代码以使用

代码语言:javascript
复制
Cipher cipher = Cipher.getInstance("blowfish/ecb/nopadding");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 06:14:37

好吧,我找到答案了。我需要将我的php代码更改为

代码语言:javascript
复制
$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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38407929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档