【发布时间】:2015-04-03 08:27:06
【问题描述】:
再一次,我的任务是将用于单点登录的 ColdFusion 代码转换为 C#,并且时间紧迫。这个问题与here 回答的问题完全不同,所以我又回到了我的脑海中。
原来的 ColdFusion 代码是在
//create a key to be used
src="xxx";
pwd="abc";
// Base64 Decoding the key
base64Decoder = createObject("java", "sun.misc.BASE64Decoder");
desKeyData = base64Decoder.decodeBuffer(pwd);
// Initialize the constructor of DESedeKeySpec with private key
KeySpec=createObject("java", "javax.crypto.spec.DESedeKeySpec");
KeySpec=KeySpec.init(desKeyData);
// Generate the secret key using SecretKeyFactory
keyFac=createObject("java", "javax.crypto.SecretKeyFactory").getInstance("DESede");
secretKey =keyFac.generateSecret(KeySpec);
// Get CIPHER OBJ ready to use
decodecipher = createObject("java", "javax.crypto.Cipher").getInstance("DESede/ECB/PKCS5Padding");
decodecipher.init(2, secretKey);
encodecipher = createObject("java", "javax.crypto.Cipher").getInstance("DESede/ECB/PKCS5Padding");
encodecipher.init(1, secretKey);
stringBytes = toString(src).getBytes("UTF8");
raw = encodecipher.doFinal(stringBytes);
// Base64Encoding of generated cipher
cipherText=ToBase64(raw);
我还有一份来自另一方的文档,其中概述了创建单点登录的步骤,如下所示:
创建加密令牌
- 创建纯文本(这对应于上面的变量src,那部分我已经在C#中成功完成了)
填充纯文本
解码key(key对应上面的变量pwd,必须是base 64解码;我想我也成功了。)
进行加密(使用上面得到的解码密钥和明文进行加密)
对密文进行编码(url编码)
我安装了 BouncyCastle 库并尝试使用这些库,但我被困在实际的加密步骤上。到目前为止,我的 C# 转换的开始看起来是这样的(令牌和键再次缩写占位符以掩盖实际值):
//steps omitted here to create src string
string token = "xxx";
string key = "abc";
byte[] decodedKeyBytes = Convert.FromBase64String(key);
我知道这不是很多事情要做,但是我尝试了很多没有奏效的事情,以至于我迷失了方向。最终,当我到达初始化密码的部分时,我认为我需要这样的东西:
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine());
非常感谢任何建议/示例。
更新:
感谢下面非常有用的答案,我能够使用以下代码来完成这项工作:
string token = "xxx";
string key = "abc";
byte[] base64DecodedKeyBytes = Convert.FromBase64String(key);
byte[] inputBytesToken = System.Text.Encoding.UTF8.GetBytes(token);
// initialize for EBC mode and PKCS5/PKCS7 padding
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine());
KeyParameter param = new KeyParameter(base64DecodedKeyBytes);
cipher.Init(true, param);
// encrypt and encode as base64
byte[] encryptedBytesToken = cipher.DoFinal(inputBytesToken);
string tokenBase64 = System.Convert.ToBase64String(encryptedBytesToken);
【问题讨论】:
标签: c# encryption coldfusion base64