【问题标题】:Crypto with Key & IV generator from a password and SALT in .NETMF使用 .NETMF 中的密码和 SALT 生成密钥和 IV 生成器的加密
【发布时间】:2012-10-05 14:04:10
【问题描述】:

我正在实现一个 .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 中获取密钥和 IV,并且我的 gadgeteer(加密)和 PC(解密)都使用相同的密码和 SALT,那么我可以处理它。是的,我听到了声音请勿使用相同的 IV 等进行多次加密。但由于成本和其他问题,我必须不要将 gadgeteer 连接到 wifi。在这种情况下,这是一种安全的方式吗?还是需要很多改进(例如公钥和私钥实现等)?怎么做?

如果有任何建议,我会很高兴,谢谢

穆拉特

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2011-12-12
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多