加密密钥和密钥来自密码的IV生成器和.NETMF中的SALT

时间:2012-10-15 14:57:03

标签: c# .net encryption .net-micro-framework .net-gadgeteer

我正在实现.NET Micro Framework应用程序,我有一个代码,例如:

public static void Main()
{
    string data = "Here is some text to encrypt.";

    AesCryptoServiceProvider csp = new AesCryptoServiceProvider();
    csp.GenerateKey();
    csp.GenerateIV();

    CryptoKey k = csp.Key;
    byte[] iv = csp.IV;

    byte[] key = k.ExportKey(true);

    AesCryptoServiceProvider csp2 = new AesCryptoServiceProvider();

    byte[] enc = AesEncrypt(UTF8Encoding.UTF8.GetBytes(data), key, iv);
    byte[] dec = AesDecrypt(enc, key, csp.IV);
    char[] c = UTF8Encoding.UTF8.GetChars(dec);
    string decodedStr = new string(c);
    Debug.Print("\n dec: " + decodedStr );
}

public static byte[] AesEncrypt(byte[] data, byte[] key, byte[] iv)
{
    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
    {
        csp.Key = CryptoKey.ImportKey(csp.Session, key,
        CryptoKey.KeyClass.Secret, CryptoKey.KeyType.AES, true);

        csp.IV = iv;
        using (ICryptoTransform encr = csp.CreateEncryptor())
        {
            return encr.TransformFinalBlock(data, 0, data.Length);
        }
    }
}
public static byte[] AesDecrypt(byte[] encryptedData, byte[] key, byte[] iv)
{
    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
    {
        csp.Key = CryptoKey.ImportKey(csp.Session, key,
        CryptoKey.KeyClass.Secret, CryptoKey.KeyType.AES, true);
        csp.IV = iv;
        using (ICryptoTransform decr = csp.CreateDecryptor())
        {

            return decr.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
        }
    }
}

我的gadgeteer(FEZ Hydra)会加密一些文字。它将具有互联网连接,因此它将通过OLED显示器或某物输出。我将在.NET Framework PC中解密它。 现在我有两个问题:

1-不幸的是,.NETMF 4.2 RTM(QFE2)没有.NET Framework中存在的任何函数,例如Rfc2898DeriveBytesRandomNumberGenerator。因此,我找不到从密码和SALT中获取Key& IV的方法。

2-(假设我们解决了问题#1)我无法使用随机密钥和IV进行每次加密/解密,因为gadgeteer没有互联网连接,以便以安全的方式将密钥和IV发送到我的.NET Framework PC 。所以我认为一个替代解决方案:如果我得到关键&四,来自密码& SALT,我的gadgeteer(加密)和PC(解密)使用相同的密码&盐,然后我可以处理它。是的我听到声音不要使用相同的IV等进行多次加密.. 但是我必须不要因为成本和其他问题而将gadgeteer连接到wifi。在这种情况下,这是一种安全的方法吗?还是需要进行大量改进(例如公共和私钥实施等)?怎么样?

我会很高兴任何建议,谢谢你

穆拉特

1 个答案:

答案 0 :(得分:0)

我没有使用.net Micro Framework。但是,api列表中有一个名为RNGCryptoServiceProvider的随机数生成器。 Rfc2898DeriveBytes只是使用Hmac-Sha1的PBKDF2实现,并且存在一个支持HMAC-SHA1的KeyedHashAlgorithm类(请参阅算法PBKDF2,这非常简单)。