8

最終編集:解決済み、ローカル dev を railo 3.3.4.003 にアップグレードすると問題が解決しました。


いくつかの文字列を RC4 暗号化し、それらを base64 でエンコードする必要があり、同じ入力が 2 つの異なる開発セットアップで異なる出力を生成する状況に陥っています。

たとえば、test2@mail.com
あるマシン (DEV-1) では次の文字列を取得DunU+ucIPz/Z7Ar+HTw=
し、もう 1 つのマシン (DEV-2) では次のようになります。DunU+ucIlZfZ7Ar+HTw=

まず、ここにある関数を使用して rc4 で暗号化しています。次に、次の場所にフィードします。toBase64( my_rc4_encrypted_data, "iso-8859-1")

私が知る限り、rc4暗号化の出力は両方で同じです(または何かが欠けています)。以下は、両方のマシンの SERVER 変数と暗号化機能です。

これは私たちが単に一緒に暮らさなければならないものですか、それとも「適切に処理する」ために私にできることはありますか (より良い言葉がないため)。将来、これが私を噛むのではないかと心配しており、それを回避できるのだろうか.

編集 1: my_rc4_encrypted_data.getBytes() からの出力の戻り値: dev-1:

Native Array (byte[])
14--23--44--6--25-8-63-63--39--20-10--2-29-60

開発-2:

Native Array (byte[])
14--23--44--6--25-8-63-63--39--20-10--2-29-60

(エンコーディングは に渡されませんgetBytes())

DEV-1 (リモート)

server.coldfusion
productname Railo
productversion  9,0,0,1

server.java
archModel   64
vendor  Sun Microsystems Inc.
version 1.6.0_26

server.os
arch    amd64
archModel   64
name    Windows Server 2008 R2
version 6.1

server.railo
version 3.3.2.002

server.servlet
name    Resin/4.0.18

DEV-2 (ローカル)

server.coldfusion
productname     Railo
productversion  9,0,0,1

server.java
vendor  Oracle Corporation
version 1.7.0_01

server.os
arch    x86 
name    Windows 7
version 6.1

server.railo
version 3.2.2.000

server.servlet
name    Resin/4.0.18

RC4 機能:

function RC4(strPwd,plaintxt) {
  var sbox = ArrayNew(1);
  var key = ArrayNew(1);
  var tempSwap = 0;
  var a = 0;
  var b = 0;
  var intLength = len(strPwd);
  var temp = 0;
  var i = 0;
  var j = 0;
  var k = 0;
  var cipherby = 0;
  var cipher = "";

  for(a=0; a lte 255; a=a+1) {  
    key[a + 1] = asc(mid(strPwd,(a MOD intLength)+1,1));
    sbox[a + 1] = a;
  }

  for(a=0; a lte 255; a=a+1) {  
    b = (b + sbox[a + 1] + key[a + 1]) Mod 256;   
    tempSwap = sbox[a + 1];
    sbox[a + 1] = sbox[b + 1];
    sbox[b + 1] = tempSwap;    
  }

  for(a=1; a lte len(plaintxt); a=a+1) {  
    i = (i + 1) mod 256;
    j = (j + sbox[i + 1]) Mod 256;    
    temp = sbox[i + 1];
    sbox[i + 1] = sbox[j + 1];
    sbox[j + 1] = temp;
    k = sbox[((sbox[i + 1] + sbox[j + 1]) mod 256) + 1];    
    cipherby = BitXor(asc(mid(plaintxt, a, 1)), k);
    cipher = cipher & chr(cipherby);      
  }
  return cipher;
}
4

2 に答える 2

2

リーは次のように書いています。

ただし、テストでは必ず同じエンコーディングを使用してください。つまり、String.getBytes(encoding) (編集) 省略すると、jvm のデフォルトが使用されます。

Leighの言うとおりです。RAILO-1393により、 3.3.0.017 の文字セット エンコーディングに関連する toBase64が変更されました。これは、使用している 3.3.2.002 と 3.2.2.000 の間のバージョンです。

于 2013-02-01T15:14:09.807 に答える
0

私が知る限り、rc4暗号化出力は両方で同じです(または何かが欠けています)。以下は、両方のマシンからのSERVER変数と暗号化機能です。

出力を2つのファイルに保存してから、ファイルサイズを比較するか、さらに良いことに、ファイル比較ツールを使用することをお勧めします。Base64エンコーディングは、バイナリデータを文字列データに変換するための標準的なアプローチです。

バイナリファイルが両方とも完全に100%同じであると仮定して、両方のサーバーでデータをbase 64に変換してから、もう一度バイナリに戻してみてください。サーバーの1つだけ(またはどちらも)がデータを再びバイナリに変換できないと予測します。その時点で、どのサーバーが問題を引き起こしているかについての手がかりがあり、さらに掘り下げることができます。

両方がbase64データをバイナリに逆変換でき、バイナリが両方のサーバーで正しい場合...まあ、わかりません。

于 2013-01-14T17:31:03.553 に答える