当前位置: 首页 > 知识库问答 >
问题:

使用非对称密钥在UWP进行编码/解码

岳正浩
2023-03-14

我正在尝试找到一种使用私钥加密字符串并使用公钥解密它的方法。我使用OpenSSL生成密钥,如下所述:

http://www.akadia.com/services/ssh_test_certificate.html

这就是我目前拥有的

public static string Encrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

        CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null);

        return CryptographicBuffer.EncodeToBase64String(encryptedData);
    }
    catch (Exception e)
    {
        throw;
        return "Error in Encryption:With RSA ";
    }
}

然而,在< code>ImportPublicKey方法上,我得到一个异常< code>ASN1损坏数据

传递给该方法的字符串key具有以下格式:

var privateKey =

@“MIICXWIBAAKBGQDUTQFSNFIQX3AEPORHJYCCK007CFU4FXLUTIYF6U9IPDHYPD…yDxwZVmexltyK5Bwc26lmb 5ETEIC kZToYWcCucF8lsok=”;

所以OpenSSL生成的密钥文件的内容没有这部分:

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

共有1个答案

巫马磊
2023-03-14

好吧,所以我的代码是相当错误的,因为我想用私钥加密,但使用了< code>ImportPublicKey函数,正确的方法应该是;

public static string Encrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

        var keyPar = provider.ImportKeyPair(keyBuffer, CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey);
        //CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Encrypt(keyPar, dataBuffer, null);
        var encryptedStr = CryptographicBuffer.EncodeToBase64String(encryptedData);
        var signature = CryptographicEngine.Sign(keyPar, dataBuffer);
        var signatureStr = CryptographicBuffer.EncodeToBase64String(signature);
        return encryptedStr;
    }
    catch (Exception e)
    {
        throw;
        return "Error in Encryption:With RSA ";
    }
}

这可以使用RSA私钥对字符串进行加密。

但是,当我尝试使用公钥解密时,使用以下类似方法;

public static string Decrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha256);

        CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Decrypt(publicKey, dataBuffer, null);
        return CryptographicBuffer.EncodeToBase64String(encryptedData);
    }
    catch (Exception e)
    {
        throw;
        return "Error in Decryption:With RSA ";
    }
}

我得到一个< code > Method or operation not implemented(方法或操作未实现)异常,要么仍然有问题,要么在UWP还没有私有加密/公共解密方法。

我最后做的是让nuget软件包<code>可移植。BouncyCastle签名,并遵循此答案中的代码段:

C#BouncyCastle-使用公钥/私钥进行RSA加密

像沙姆一样工作。

 类似资料:
  • 使用指定密码生成对称密钥,保存并返回ID。 调用: web3.shh.generateSymKeyFromPassword(password, [callback]) 参数: password:String - 用于生成对称密钥的密码 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个参数为返回结果 返回值: String - 成功时返回ID,否则返回错误信息

  • 我想得到的是 使用libnail加密密码salt 我有一个列表的盐,我想用它来加密/解密我的密码。当我加密密码时,我得到一个哈希返回,这样一个似乎可以工作,但在解密时,我总是得到假返回值。 我是否使用了错误的方法对libnaude进行加密/解密,还是完全朝着错误的方向行驶? 我的加密/解密源: 我感谢任何帮助! 多姆

  • 我知道这很难...但我使用OpenSSL以一种非常标准的方式加密文件。该文件使用RSA-2048公钥在AES-256中加密。我想在Java中使用私钥解密文件。我研究了很长时间,尝试了很多方法,但似乎都行不通。我只是找到相关的问题与工作的解决方案,但不是确切地为我的问题。 我使用以下命令生成public-/private-key-pair:

  • 我想用python实现下面的功能,它使用公钥加密密码,然后使用base 64进行编码。我搜索了许多答案,但没有找到解决方案,我想可能是我不明白。请给我一些建议好吗? 我使用以下代码,但它会引发错误。

  • 问题内容: 我想生成rsa密钥对(公共和私有),然后将它们用于AES加密和解密。例如,用于加密的公共密钥和用于解密的私有密钥。我为此编写了一个简单的代码,但是问题是当我运行时这段代码我得到这个错误: 我该如何解决这个问题?我的加密代码如下: 问题答案: 如评论中所建议,我搜索了“混合密码术”。这个例子解决了我的问题。