【问题标题】:Encrypt String in winrt c# and decrypt it in c# .net在winrt c#中加密字符串并在c#.net中解密
【发布时间】:2013-01-11 01:13:48
【问题描述】:

如何在 C# 中的 WinRT Metro 上使用非对称加密对字符串进行加密,并在经典 Windows 中解密,比如在 Web 服务中?

我想使用 RsaPkcs1 算法,我可以看到 CryptographicKey 类和 RSAParameters 类甚至不兼容。

如何做到这一点?

【问题讨论】:

    标签: c# windows-runtime encryption encryption-asymmetric


    【解决方案1】:

    我找到了有关如何以 .net 4 可以成功使用的格式从 CryptographicKey 导出密钥的解决方案。

    CryptographicKey 有 2 个功能 1. Export 和 2。 ExportPublicKey。我使用了导出私钥的第一个函数。此函数有 2 个参数,第一个是导出类型,第二个是要填充的 byte[]。

    如果使用CryptographicPrivateKeyBlobType.Capi1PrivateKey,Export将产生的blob与.net 4的RSACryptoServiceProvider可以导入的WinCAPI兼容。

    WinRT

    String str = "String To Encrypt";
    IBuffer buf = CryptographicBuffer.ConvertStringToBinary(str,BinaryStringEncoding.Utf16BE);
    String AsymmetricAlgName = Windows.Security.Cryptography.Core.AsymmetricAlgorithmNames.RsaPkcs1;
    AsymmetricKeyAlgorithmProvider asym = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgName);
    CryptographicKey key = asym.CreateKeyPair(512);
    IBuffer enc = CryptographicEngine.Encrypt(key, buf, null);
    byte[] encryptedbyteArr;
    CryptographicBuffer.CopyToByteArray(enc, out encryptedbyteArr);
    String encryptedBase64Str = Convert.ToBase64String(encryptedbyteArr);
    
    
    //Export the private Key in WinCapi format
    
    byte[] privatekeyBytes;
    CryptographicBuffer.CopyToByteArray(key.Export(CryptographicPrivateKeyBlobType.Capi1PrivateKey), out privatekeyBytes);
    String privatekeyBase64 = Convert.ToBase64String(privatekeyBytes);
    

    encryptedBase64Str 现在包含 Base64 中的加密字符串。让我们说encryptedBase64Str="BwIAAACkAABSU0EyAAIAAAEAAQCFrMTqMU3T14zSUM5..."

    网络服务

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    String privateKey64 = "BwIAAACkAABSU0EyAAIAAAEAAQCFrMTqMU3T14zSUM5...";
    String EncryptedString = "PbauDOjqMLD2P6WSmEw==";
    byte[] EncryptedDataBlob = Convert.FromBase64String(EncryptedString);
    byte[] privateKeyBlob = Convert.FromBase64String(privateKey64);
    byte[] decryptedBytes;
    rsa.ImportCspBlob(privateKeyBlob);
    decryptedBytes = rsa.Decrypt(EncryptedDataBlob, false);
    String decryptedString =System.Text.Encoding.BigEndianUnicode.GetString(decryptedBytes);
    


    decryptedString 现在包含 WinRT 拥有的解密字符串。

    【讨论】:

    • 顺便说一句,我并不是说以这种方式导出密钥是安全的,但它展示了如何在winrt和.net之间导出-导入密钥
    【解决方案2】:

    您必须使用公钥来解密内容。 不要忘记在 WinRt 版本中导出公钥!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多