首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冷融合加解密在C#中的应用

冷融合加解密在C#中的应用
EN

Stack Overflow用户
提问于 2014-10-03 20:50:58
回答 2查看 1.8K关注 0票数 1

以下是用于在coldfusion中加密的代码

代码语言:javascript
复制
<cfset strBase64Value = encrypt(strValue,24 character key,AES) />

它正在生成像714FEA9A9A2184769CA49D5133F08580这样的加密值,这在我看来很奇怪,因为它只是大写和数字。

我应该使用什么C#库来正确地解密它?

另外,看看这一信息,在默认情况下,它似乎使用UUEncode算法进行编码。

我应该让加密器使用Base64作为编码参数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-04 02:36:44

它正在生成像714FEA9A9A2184769CA49D5133F08580这样的加密值。

然后他们使用的是“十六进制”,而不是默认的"UUEncode“。“十六进制”或"base64“都可以。只要你们都同意编码,那就不重要了。

您可以使用RijndaelManaged解密字符串。但是,ColdFusion和C#的默认加密设置略有不同。具有加密功能:

  • "AES“是”AES/ECB/PKCS5填充“的缩写
  • "ECB“模式不使用IV
  • 键字符串始终是base64编码的。

NB:尽管名称不同,但对于SUN提供者来说,PKCS5Padding (CF/Java)对应于PaddingMode.PKCS7 (C#)。正如在这个线程中提到的,Java中的“. SUN提供者”表示应该使用PKCS#7的PKCS#5 -- "PKCS5Padding“应该是"PKCS7Padding”。这是一个遗留下来的问题,当时只有8字节块密码,比如(三重) DES对称密码。

因此,您需要确保您的C#设置调整为匹配。考虑到这一点,只需解码加密的文本来自妖术和base64中的密钥字符串即可。使用API中稍显丑陋的示例,只需调整算法设置以匹配encrypt()函数所使用的设置:

加密ColdFusion

代码语言:javascript
复制
<cfscript>
    plainText     = "Nothing to see";
    // 128 bit key base64 encoded
    keyInBase64   = "Y25Aju8H2P5DR8mY6B0ezg==";
    // "AES" is short for "AES/ECB/PKCS5Padding"
    encryptedText = encrypt(plainText, keyInBase64, "AES", "hex");
    WriteDump( encryptedText );
    // result: 8889EDF02F181158AAD902AB86C63951 
</cfscript>

解密C#

代码语言:javascript
复制
byte[] bytes = SomeMethodToConvertHexToBytes( encryptedText );
byte[] key = Convert.FromBase64String( keyInBase64 );

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(bytes))
    {
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
        {
           using (StreamReader srDecrypt = new StreamReader(csDecrypt))
           {

               decryptedText = srDecrypt.ReadToEnd();
           }
        }
    }
}

Console.WriteLine("Encrypted String: {0}", encryptedText);
Console.WriteLine("Decrypted String: {0}", decryptedText);

请记住,您可以(而且可能应该)调整设置,例如使用更安全的模式而不是ECB。您只需要与CF开发人员协调这些更改。

票数 6
EN

Stack Overflow用户

发布于 2015-09-26 21:33:19

如果有类似的JAVA问题,我只是用“十六进制”和“三次加密”实现了以前在coldfusion中加密/解密的字符串的加密和解密。这是我的代码:

代码语言:javascript
复制
private static final String PADDING = "DESede/ECB/PKCS5Padding";
private static final String UTF_F8 = "UTF-8";
private static final String DE_SEDE = "DESede";
private String secretKey;


public String encrypt(String message) throws Exception {

    secretKey = getSecretKey();

    final byte[] secretBase64Key = Base64.decodeBase64(secretKey);
    final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE);
    final Cipher cipher = Cipher.getInstance(PADDING);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    final byte[] plainTextBytes = message.getBytes();
    final byte[] cipherText = cipher.doFinal(plainTextBytes);

    return Hex.encodeHexString(cipherText);
}

public String decrypt(String keyToDecrypt) throws Exception {

    secretKey = getSecretKey();

    byte[] message = DatatypeConverter.parseHexBinary(keyToDecrypt);
    final byte[] secretBase64Key = Base64.decodeBase64(secretKey);
    final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE);
    final Cipher decipher = Cipher.getInstance(PADDING);
    decipher.init(Cipher.DECRYPT_MODE, key);
    final byte[] plainText = decipher.doFinal(message);

    return new String(plainText, UTF_F8);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26186665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档