2012-05-12 11 views
1

私はこの問題を解決しようと何度も努力してきました。DESede(3DES)RAILOでの暗号化CFML

AサードパーティのWebサービスは、ECB とPKCS7paddingで3DESを使って暗号化されたデータを送信するために私を必要とする - 彼らが使用している.NET

railo CFML内の暗号化機能は、(つまり、デフォルトがある任意の更なるオプションを指定せずにDESEDEに制限され

暗号モードとパディングに使用されます)。

誰もがRailoでこの問題を抱えていて、解決策(おそらくJavaベース)を思いついていますか? - 私は真剣にここに私の髪を引っ張っている!

私はいくつかの変更を行わ下回っリーの提案に基づいて:

私は進歩の少しを作ったが、私はこのキーがそれにMD5ハッシュのいくつかの種類があると思います。

私は少しをウェブの周りに釣りをし、あなたのソリューションを修正 - 私はパディングが必要であるが、最初の文字列を暗号化された結果は、私が期待するべきであるように思われるが、その後の検査で近いそれは間違ってないと思う:

IvParameterSpec = createObject("java", "javax.crypto.spec.IvParameterSpec"); 
Cipher = createObject("java", "javax.crypto.Cipher"); 
SecretKeySpec = createObject("java", "javax.crypto.spec.SecretKeySpec"); 
BASE64Decoder = createObject("java", "sun.misc.BASE64Decoder"); 
Str = createObject("java", "java.lang.String"); 
MessageDigest = createObject("java", "java.security.MessageDigest"); 

input = "<xml><PanNumber>6280390027626871</PanNumber><Req_Currency_Code>826</Req_Currency_Code><Card_Pin>1234</Card_Pin><Till_Amount></Till_Amount><Auth_Code></Auth_Code></xml>"; 
key = "06098140901984F95E139F29B479D952CB6545C177D21456"; 

md = MessageDigest.getInstance("MD5"); 
md.update(key.getBytes("UTF-8"), 0, key.length()); 
keyBytes = md.digest(); 
newKey = tobase64(keyBytes); 
keyBytes2 = binaryDecode(newKey, "base64"); 
keyBytes2 = arrayMerge(keyBytes, arraySlice(keyBytes, 1, 8)); 
allnewKey = binaryEncode(javacast("byte[]", keyBytes2), "base64"); 

encrypted = encrypt(input, allnewKey, "desede", "base64"); 
WriteDump("encrypted (CF): "& encrypted);` 

結果は:26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6KrdbXe7NBUVADYMdGuagfO4Tev584dUcgKGJ2h6kWPZxooNUGMgL2xB7e00YOkLosA8wFD569sZUd1MGKuF9yCjY1zCsAE4SgohkcuK9YZ7BizQma99/W9yOsIjAfHtAqGiep4tMTQ + eFASYtPybccsgi8H4brIB/HAu0kaDSAw

期待resul Tは: 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6MxaAzUpJDqQBq8NGgdqmtn6q/wVQNHGWrOE8 + aetKVC78nszS3ZO8AHjwoT1igv4lGl78n8jCHHU + KwnBT7KfXIYMTCuwO/MohIiFbGyhMXPsvv3/G4OY1C2nEkN0LweLh4mTgtU8syT1M9XdmvwhaltsmPoFtoE9FujvQpJCY3

+0

(編集)あなたは、サンプルのキーと結果を投稿することができますあなたはRailoと.netに入っていますか?私はRailoがjavaのデフォルトを使用していると思います。これは 'ECB'と' PKCS5Padding'(主に8バイトのPKCS7paddingと互換性があります)です。だから理論的にはそれは箱の中で動くはずです。 – Leigh

答えて

4

railo CFML内の暗号化機能が なしDESEDEに限定される更なるオプション(すなわち暗号モードにはデフォルトが使用され、埋め込みには が使用されます)。

はい、私はそれがTripleDES/ECB/PKCS7paddingと互換性のあるjavaのデフォルト値、すなわちDESede/ECB/PKCS5Paddingを使用していると思います。したがって、24バイトのキーを使用している限り、すぐに機能するはずです。

これ以上のことがわからないと、私はあなたのキーサイズに問題があると推測しています。 .NETは16バイトと24バイトの両方のキーをサポートしていますが、Javaでは24バイトのキーしかサポートしていません。したがって、鍵が16バイトのみの場合は、Java/Railoに受け入れられるように、鍵を最初の8バイトで埋める必要があります。

CF/Railoコード

<cfscript> 
    input = "DESede (3DES) Encryption in RAILO CFML"; 
    key = "ru8femXhTm9jwdGdhb/4Sw=="; 

    // pad the key with the first eight bytes. then convert back to base64 
    keyBytes = binaryDecode(key, "base64"); 
    keyBytes = arrayMerge(keyBytes, arraySlice(keyBytes, 1, 8)); 
    newKey = binaryEncode(javacast("byte[]", keyBytes), "base64"); 

    encrypted = encrypt(input, newKey, "desede", "base64"); 
    WriteDump("encrypted (CF): "& encrypted); 
</cfscript> 

C#コード

byte[] input = Encoding.UTF8.GetBytes("DESede (3DES) Encryption in RAILO CFML"); 
byte[] key = Convert.FromBase64String("ru8femXhTm9jwdGdhb/4Sw=="); 

TripleDESCryptoServiceProvider algorithm = new TripleDESCryptoServiceProvider(); 
algorithm.Mode = CipherMode.ECB; 
algorithm.BlockSize = 64; 
algorithm.KeySize = 128; // 16 byte key 
algorithm.Key = key; 
ICryptoTransform cipher = algorithm.CreateEncryptor(); 
byte[] encrypted = cipher.TransformFinalBlock(input, 0, input.Length); 
Console.WriteLine("encrypted (.NET): {0}", Convert.ToBase64String(encrypted)); 

結果:

encrypted (CF): fMPlk0ZqHDwp2zzZs/Cng7Y6r8Acr55UPJYWJTruEesxkBApsEFo6w== 
encrypted (.NET): fMPlk0ZqHDwp2zzZs/Cng7Y6r8Acr55UPJYWJTruEesxkBApsEFo6w== 

更新:奇妙な。私は、ハッシュ.NETの鍵は私が「予想結果」のではなく、あなたの最初の結果を得るMD5とき

String rawInput = "<xml><PanNumber>6280390027626871</PanNumber><Req_Currency_Code>826</Req_Currency_Code><Card_Pin>1234</Card_Pin><Till_Amount></Till_Amount><Auth_Code></Auth_Code></xml>"; 
    String rawKey = "06098140901984F95E139F29B479D952CB6545C177D21456"; 
    byte[] input = Encoding.UTF8.GetBytes(rawInput); 
    byte[] key = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(rawKey)); 
    // ... rest of code 

結果:

encrypted (.NET): 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6KrdbXe7NB 
UVADYMdGuagfO4Tev584dUcgKGJ2h6kWPZxooNUGMgL2xB7e00YOkLosA8wFD569sZUd1MGKuF9yCjY1 
zCsAE4SgohkcuK9YZ7BizQma99/W9yOsIjAfHtAqGiep4tMTQ+eFASYtPybccsgi8H4brIB/HAu0kaDS 
Aw   
+0

ありがとうございます - 私がテストのために送ったキーはこれが役に立ちます。私はそれが24バイトであると考えています。06098140901984F95E139F29B479D952CB6545C177D21456 – eggwater

+0

と私はこれから結果を得ることができる唯一の方法です。 C#の結果)は、次の関数を使用してキーを変換するかどうかです。 ** newKey = toBase64(binaryDecode( "06098140901984F95E139F29B479D952CB6545C177D21456"、 "hex")) '** – eggwater

+0

私は少し進歩しました。キーには何らかのMD5ハッシングがあります。 – eggwater