1

私はこの問題を解決しようと何日も試みてきました。

サードパーティの 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);`

The result is: 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6KrdbXe7NBUVADYMdGuagfO4Tev584dUcgKGJ2h6kWPZxooNUGMgL2xB7e00YOkLosA8wFD569sZUd1MGKuF9yCjY1zCsAE4SgohkcuK9YZ7BizQma99/W9yOsIjAfHtAqGiep4tMTQ+eFASYtPybccsgi8H4brIB/HAu0kaDSAw

The expected result is: 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6MxaAzUpJDqQBq8NGgdqmtn6q/wVQNHGWrOE8+aetKVC78nszS3ZO8AHjwoT1igv4lGl78n8jCHHU+KwnBT7KfXIYMTCuwO/MohIiFbGyhMXPsvv3/G4OY1C2nEkN0LweLh4mTgtU8syT1M9XdmvwhaltsmPoFtoE9FujvQpJCY3

4

1 に答える 1

4

railo CFML内の暗号化機能は、それ以上のオプションがないDESedeに制限されています(つまり、デフォルトが暗号モードとパディングに使用されます)。

はい、Javaのデフォルト、つまり.NETDESede/ECB/PKCS5Paddingと互換性のあるデフォルトを使用していると思います。TripleDES/ECB/PKCS7paddingしたがって、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          
于 2012-05-13T05:58:01.887 に答える