2

I ran into a problem when trying to integrate with a payment processor (CCBill) who is requesting a string to be encrypted to be used as a token, using the TripleDES standard. My application is in Java, and the result I am getting back is not what the payment processor expects.

There is a post here that is addressing Perl<->PHP and Perl<->ColdFusion, but no solutions for Java.

The PERL version of the code looks like this:

#!/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==

This is my little Java class trying to do the same as the perl script, but which returns a completely different value:

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==
    }
}

Any suggestions and help would be much appreciated.

Community
  • 1
  • 1
Lucia Ivascu
  • 130
  • 1
  • 5
  • In the meantime I have tried a few other things that didn't work either. I have padded the key with 0's until it reached a size of 48; I have padded the text with spaces until it reached a size which was multiple of 8. And it still didn't give back the expected result. – Lucia Ivascu Oct 20 '14 at 00:13

0 Answers0