他のアプリケーションのデータを一部解読するColdFusionページがあります。 ColdFusionコードはかなり簡単です:RC4/Hexを使用して、ColdFusionからDecrypt関数を.NETに変換します。
decrypt(theString,encryptKey,algorithmType,encodeType)
アルゴリズムタイプはRC4で、エンコードタイプは16進数です。何らかの理由で私はこれをネットで動かすのにかなり手間がかかります。この種のものに利用できるリソースはありますか、それともかなり簡単な答えがありますか?
私はここで見つけるRC4クラスを使用し始めました。エンコーディングをAsciiに変更しましたが、結果はまだ一致しません。
public static class RC4
{
public static string Encrypt(string key, string data)
{
Encoding unicode = Encoding.Unicode;
return Convert.ToBase64String(Encrypt(unicode.GetBytes(key), unicode.GetBytes(data)));
}
public static string Decrypt(string key, string data)
{
Encoding unicode = Encoding.Unicode;
return unicode.GetString(Encrypt(unicode.GetBytes(key), Convert.FromBase64String(data)));
}
public static byte[] Encrypt(byte[] key, byte[] data)
{
return EncryptOutput(key, data).ToArray();
}
public static byte[] Decrypt(byte[] key, byte[] data)
{
return EncryptOutput(key, data).ToArray();
}
private static byte[] EncryptInitalize(byte[] key)
{
byte[] s = Enumerable.Range(0, 256)
.Select(i => (byte)i)
.ToArray();
for (int i = 0, j = 0; i < 256; i++)
{
j = (j + key[i % key.Length] + s[i]) & 255;
Swap(s, i, j);
}
return s;
}
private static IEnumerable<byte> EncryptOutput(byte[] key, IEnumerable<byte> data)
{
byte[] s = EncryptInitalize(key);
int i = 0;
int j = 0;
return data.Select((b) =>
{
i = (i + 1) & 255;
j = (j + s[i]) & 255;
Swap(s, i, j);
return (byte)(b^s[(s[i] + s[j]) & 255]);
});
}
private static void Swap(byte[] s, int i, int j)
{
byte c = s[i];
s[i] = s[j];
s[j] = c;
}
}
問題の詳細について教えてください。 – rossum
何を試しましたか?そのアルゴリズムはコアライブラリの一部ではないようですが、クイック検索でカスタム実装がいくつか登場しました。後方互換性の理由からRC4を維持する必要があると仮定していますか? – Leigh
奇妙なことに、RC4は、暗号化のCFドキュメンテーションがありますが、復号化はできません。なぜそうなるのか分かりません。 – Josh