TripleDes Perl< - > Java(CCBill实现)

时间:2014-10-17 04:17:07

标签: java perl encryption tripledes

尝试与支付处理器(CCBill)集成时遇到问题,该处理器请求使用TripleDES标准将字符串加密以用作令牌。我的应用程序是Java,我得到的结果不是支付处理器所期望的。

有一篇文章here正在解决Perl< - > PHP和Perl< - > ColdFusion,但没有针对Java的解决方案。

代码的PERL版本如下所示:

#!/usr/bin/perl
# Perl Crypt Calamity (here be...something)
use strict;
use CGI;
use MIME::Base64;
use Crypt::TripleDES;

my $cgi = CGI->new();
my $param = $cgi->Vars();

$param->{key} = "bC5PEcLzvb+jY1FZWuP4pw50";
$param->{string} = "subscriptionId=0214288302000000207";
my $des = Crypt::TripleDES->new();

my $enc = $des->encrypt3($param->{string}, $param->{key});
$enc = encode_base64($enc);
$enc =~ s/\n//gs;

# resulting string (enc): yvT6h6jti9krth/BaA3cO3ABKult8N38fnEb24MS0BwnX+gc1NNgEA==

这是我的小Java类尝试与perl脚本一样,但它返回一个完全不同的值:

import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

import org.apache.commons.codec.binary.Base64;


public class Encoder {


    public String encrypt(String message, String encryptionKey) throws Exception {  

        // handle the key 
        SecretKey secretKey = null;
        byte[] keyValueAsBytes  =  Arrays.copyOf(encryptionKey.getBytes("UTF-8"), 24);

        DESedeKeySpec keySpec = new DESedeKeySpec(keyValueAsBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); 
        secretKey = keyFactory.generateSecret(keySpec);

        // cipher 
        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // encode
        byte[] plainText = message.getBytes("UTF-8");
        byte[] encryptedText = cipher.doFinal(plainText);       
        return Base64.encodeBase64String(encryptedText);
    }


    public static void main(String[] args) throws Exception{
        String secretKey = "bC5PEcLzvb+jY1FZWuP4pw50";
        String message = "subscriptionId=0214288302000000207";

        Encoder enc = new Encoder();
        System.out.println(enc.encrypt(message, secretKey));
        //returns:hw6JzwdvmjwORzmitXcQ6vsmskK6vtdIObu+KYiGW4D4DRwNGHEX2w==
    }
}

非常感谢任何建议和帮助。

0 个答案:

没有答案