C# 在ColdFusion中加密,在C中解密#
我有一个字符串,它是使用函数coldfusion9加密的。问题是该函数是使用UUEncode算法(默认)调用的。我需要用C#解密这个值。所有示例都使用Base64编码。有什么想法吗 下面是ColdFusion中使用的内容C# 在ColdFusion中加密,在C中解密#,c#,encryption,coldfusion-9,C#,Encryption,Coldfusion 9,我有一个字符串,它是使用函数coldfusion9加密的。问题是该函数是使用UUEncode算法(默认)调用的。我需要用C#解密这个值。所有示例都使用Base64编码。有什么想法吗 下面是ColdFusion中使用的内容 <cfset encryptionKey = generateSecretKey( "AES" ) /> <cfset pwhash = encrypt( user_password, encrypti
<cfset encryptionKey = generateSecretKey( "AES" ) />
<cfset pwhash = encrypt( user_password,
encryptionKey,
"AES",
"UU"
) />
我有结果值。我还有一个用户的解密值,因此我可以将其与C#中的内容进行比较。我需要解密系统中所有用户的密码。多亏了@Leigh和他的回答,我能够使用如下方法实现一个解决方案:
公共类密码助手
{
公共字符串解密AES(字符串加密字符串、字符串密钥)
{
//首次写入内存
MemoryStream mmsStream=新的MemoryStream();
StreamWriter srwTemp=新的StreamWriter(mmstream);
//sBuffer是我的编码文本。
srwTemp.Write(加密字符串);
srwTemp.Flush();
mmstream.Position=0;
MemoryStream outstream=新的MemoryStream();
//CallingUdeCode
UUDecode(彩信流、外扩);
//提取每个值的字节
字节[]输入=超出流。ToArray();
字节[]键=Convert.FromBase64String(键);
字符串decryptedText=null;
使用(RijndaelManaged algorithm=new RijndaelManaged())
{
//初始化设置以匹配CF使用的设置
算法.Mode=CipherMode.ECB;
算法.Padding=PaddingMode.PKCS7;
算法.BlockSize=128;
算法.KeySize=128;
算法。密钥=密钥;
ICryptoTransform decryptor=算法.CreateDecryptor();
使用(MemoryStream msDecrypt=新的MemoryStream(输入))
{
使用(CryptoStream csDecrypt=新加密流(msDecrypt、解密程序、CryptoStreamMode.Read))
{
使用(StreamReader srDecrypt=新的StreamReader(csDecrypt))
{
decryptedText=srDecrypt.ReadToEnd();
}
}
}
}
返回解密文本;
}
}
公共静态类编解码器
{
静态只读字节[]UUEncMap=新字节[]
{
0x60、0x21、0x22、0x23、0x24、0x25、0x26、0x27,
0x28、0x29、0x2A、0x2B、0x2C、0x2D、0x2E、0x2F、,
0x30、0x31、0x32、0x33、0x34、0x35、0x36、0x37,
0x38、0x39、0x3A、0x3B、0x3C、0x3D、0x3E、0x3F、,
0x40、0x41、0x42、0x43、0x44、0x45、0x46、0x47,
0x48、0x49、0x4A、0x4B、0x4C、0x4D、0x4E、0x4F、,
0x50、0x51、0x52、0x53、0x54、0x55、0x56、0x57,
0x58、0x59、0x5A、0x5B、0x5C、0x5D、0x5E、0x5F
};
静态只读字节[]UUDecMap=新字节[]
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07,
0x08、0x09、0x0A、0x0B、0x0C、0x0D、0x0E、0x0F、,
0x10、0x11、0x12、0x13、0x14、0x15、0x16、0x17,
0x18、0x19、0x1A、0x1B、0x1C、0x1D、0x1E、0x1F、,
0x20、0x21、0x22、0x23、0x24、0x25、0x26、0x27,
0x28、0x29、0x2A、0x2B、0x2C、0x2D、0x2E、0x2F、,
0x30、0x31、0x32、0x33、0x34、0x35、0x36、0x37,
0x38、0x39、0x3A、0x3B、0x3C、0x3D、0x3E、0x3F、,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
公共静态解码(System.IO.Stream输入,System.IO.Stream输出)
{
如果(输入==null)
抛出新的ArgumentNullException(“输入”);
if(输出==null)
抛出新的ArgumentNullException(“输出”);
long len=输入长度;
如果(len==0)
返回;
长didx=0;
int nextByte=input.ReadByte();
而(下一字节>=0)
{
//获取行长度(以编码的八位字节数为单位)
int line_len=UUDecMap[nextByte];
//ascii可打印到0-63和4字节到3字节的转换
长端=didx+线路长度;
字节A、B、C、D;
如果(结束>2)
{
而(didx4)和3));
output.WriteByte((字节)((B>2)和15));
output.WriteByte((字节)((C4)和3));
didx++;
}
if(didx2)和15));
didx++;
}
//跳过填充
做
{
nextByte=input.ReadByte();
}
而(nextByte>=0&&nextByte!='\n'&&nextByte!='\r');
//跳过行尾
做
{
nextByte=input.ReadByte();
}
而(nextByte>=0&(nextByte='\n'| | nextByte=='\r');
}
}
公共静态编码(System.IO.Stream输入,System.IO.Stream输出)
{
如果(输入==null)
抛出新的ArgumentNullException(“输入”);
if(输出==null)
抛出新的ArgumentNullException(“输出”);
long len=输入长度;
如果(len==0)
返回;
int-sidx=0;
int line_len=45;
byte[]nl=Encoding.ASCII.GetBytes(Environment.NewLine);
字节A,
public class PasswordHelper
{
public string DecryptAES(string encryptedString, string Key)
{
//First write to memory
MemoryStream mmsStream = new MemoryStream();
StreamWriter srwTemp = new StreamWriter(mmsStream);
//sBuffer is my encodedtext.
srwTemp.Write(encryptedString);
srwTemp.Flush();
mmsStream.Position = 0;
MemoryStream outstream = new MemoryStream();
//CallingUUDecode
Codecs.UUDecode(mmsStream, outstream);
//Extract the bytes of each of the values
byte[] input = outstream.ToArray();
byte[] key = Convert.FromBase64String(Key);
string decryptedText = null;
using (RijndaelManaged algorithm = new RijndaelManaged())
{
// initialize settings to match those used by CF
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
algorithm.BlockSize = 128;
algorithm.KeySize = 128;
algorithm.Key = key;
ICryptoTransform decryptor = algorithm.CreateDecryptor();
using (MemoryStream msDecrypt = new MemoryStream(input))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
decryptedText = srDecrypt.ReadToEnd();
}
}
}
}
return decryptedText;
}
}
public static class Codecs
{
static readonly byte[] UUEncMap = new byte[]
{
0x60, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F
};
static readonly byte[] UUDecMap = new byte[]
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
public static void UUDecode(System.IO.Stream input, System.IO.Stream output)
{
if (input == null)
throw new ArgumentNullException("input");
if (output == null)
throw new ArgumentNullException("output");
long len = input.Length;
if (len == 0)
return;
long didx = 0;
int nextByte = input.ReadByte();
while (nextByte >= 0)
{
// get line length (in number of encoded octets)
int line_len = UUDecMap[nextByte];
// ascii printable to 0-63 and 4-byte to 3-byte conversion
long end = didx + line_len;
byte A, B, C, D;
if (end > 2)
{
while (didx < end - 2)
{
A = UUDecMap[input.ReadByte()];
B = UUDecMap[input.ReadByte()];
C = UUDecMap[input.ReadByte()];
D = UUDecMap[input.ReadByte()];
output.WriteByte((byte)(((A << 2) & 255) | ((B >> 4) & 3)));
output.WriteByte((byte)(((B << 4) & 255) | ((C >> 2) & 15)));
output.WriteByte((byte)(((C << 6) & 255) | (D & 63)));
didx += 3;
}
}
if (didx < end)
{
A = UUDecMap[input.ReadByte()];
B = UUDecMap[input.ReadByte()];
output.WriteByte((byte)(((A << 2) & 255) | ((B >> 4) & 3)));
didx++;
}
if (didx < end)
{
B = UUDecMap[input.ReadByte()];
C = UUDecMap[input.ReadByte()];
output.WriteByte((byte)(((B << 4) & 255) | ((C >> 2) & 15)));
didx++;
}
// skip padding
do
{
nextByte = input.ReadByte();
}
while (nextByte >= 0 && nextByte != '\n' && nextByte != '\r');
// skip end of line
do
{
nextByte = input.ReadByte();
}
while (nextByte >= 0 && (nextByte == '\n' || nextByte == '\r'));
}
}
public static void UUEncode(System.IO.Stream input, System.IO.Stream output)
{
if (input == null)
throw new ArgumentNullException("input");
if (output == null)
throw new ArgumentNullException("output");
long len = input.Length;
if (len == 0)
return;
int sidx = 0;
int line_len = 45;
byte[] nl = Encoding.ASCII.GetBytes(Environment.NewLine);
byte A, B, C;
// split into lines, adding line-length and line terminator
while (sidx + line_len < len)
{
// line length
output.WriteByte(UUEncMap[line_len]);
// 3-byte to 4-byte conversion + 0-63 to ascii printable conversion
for (int end = sidx + line_len; sidx < end; sidx += 3)
{
A = (byte)input.ReadByte();
B = (byte)input.ReadByte();
C = (byte)input.ReadByte();
output.WriteByte(UUEncMap[(A >> 2) & 63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 | (A << 4) & 63]);
output.WriteByte(UUEncMap[(C >> 6) & 3 | (B << 2) & 63]);
output.WriteByte(UUEncMap[C & 63]);
}
// line terminator
for (int idx = 0; idx < nl.Length; idx++)
output.WriteByte(nl[idx]);
}
// line length
output.WriteByte(UUEncMap[len - sidx]);
// 3-byte to 4-byte conversion + 0-63 to ascii printable conversion
while (sidx + 2 < len)
{
A = (byte)input.ReadByte();
B = (byte)input.ReadByte();
C = (byte)input.ReadByte();
output.WriteByte(UUEncMap[(A >> 2) & 63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 | (A << 4) & 63]);
output.WriteByte(UUEncMap[(C >> 6) & 3 | (B << 2) & 63]);
output.WriteByte(UUEncMap[C & 63]);
sidx += 3;
}
if (sidx < len - 1)
{
A = (byte)input.ReadByte();
B = (byte)input.ReadByte();
output.WriteByte(UUEncMap[(A >> 2) & 63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 | (A << 4) & 63]);
output.WriteByte(UUEncMap[(B << 2) & 63]);
output.WriteByte(UUEncMap[0]);
}
else if (sidx < len)
{
A = (byte)input.ReadByte();
output.WriteByte(UUEncMap[(A >> 2) & 63]);
output.WriteByte(UUEncMap[(A << 4) & 63]);
output.WriteByte(UUEncMap[0]);
output.WriteByte(UUEncMap[0]);
}
// line terminator
for (int idx = 0; idx < nl.Length; idx++)
output.WriteByte(nl[idx]);
}
}