小编Top*_*aco的帖子

AsnContentException:提供的数据标记为“通用”类值“16”,但它应该是“通用”类值“2”

我正在尝试使用 BouncyCastle 创建 RSA 密钥对,然后尝试导入生成的公钥,但收到以下错误

AsnContentException: The provided data is tagged with 'Universal' class value '16', but it should have been 'Universal' class value '2'.

代码如下

RsaKeyPairGenerator rsaKeyPairGenerator = new RsaKeyPairGenerator();
rsaKeyPairGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
    
AsymmetricCipherKeyPair keys = rsaKeyPairGenerator.GenerateKeyPair();
    
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keys.Private);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded();
    
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keys.Public);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
    
RSA publicRsaKey = RSA.Create();
publicRsaKey.ImportRSAPublicKey(serializedPublicBytes, out _);
Run Code Online (Sandbox Code Playgroud)

有人知道我为什么会收到这个吗?

.net c# security rsa bouncycastle

7
推荐指数
1
解决办法
1万
查看次数

如何使用 OpenSSL C 库和公钥文件加密字符串?

使用C 库而不是同名的命令行工具)使用公钥文件将一个 Short 加密std::string为另一个Short 的推荐方法是什么,并且了解算法?(在这种情况下,字符串不大于 ~100 字节,密钥文件采用格式,算法可以是任何非对称算法,例如 RSA/ECDSA/等)。std::stringopenssl .pem

我希望编写一个具有如下接口的函数bool EncryptString(const std::string& InStr, const std::string& InPublicKey, std::string& OutString)

通过查看文档,似乎EVP_PKEY_encrypt是要使用的函数,它需要一个EVP_PKEY_CTX *ctx变量。我的假设是,这个变量应该用 初始化EVP_PKEY_CTX_new,而这又需要 anEVP_PKEY *pkey和 an ENGINE *e。那些我不知道如何初始化,并且搜索文档让我非常困惑。

也许这些函数不是最简单的方法,我对这个库根本不熟悉,也没有密码学知识。我只关心将字符串转换为加密字符串的黑盒方法。

谢谢

c c++ encryption openssl cryptography

7
推荐指数
1
解决办法
4013
查看次数

使用 OpenSSL C++ 库和 PHP 的 Blowfish 加密数据不一致

我正在尝试开发一个 C++ 程序,对一些数据进行加密,以便稍后使用基于 PHP 的 Web 服务进行解密。但是,我在使用 PHP 中的 openssl_decrypt() 方法使用 Blow-fish CBC 方法解密数据时遇到问题。

我正在测试此代码 C++ 代码来加密消息并转换为 base64 格式以使用我的 PHP 程序进行解密。这是 C++ 程序的代码。

#include <secureinfra.hpp>
#include <iostream>

int main()
{
    cout << "Unit Test for the crypto system" << endl;
    SecureInfrastructure mySec;

    /* A 256 bit key and IV */
    auto *key = (unsigned char *)"ZdOAq0yn6H1i35TywbLrtqBO4NCjh7Vh";
    auto *iv = (unsigned char *)"01234567";

    /* Message to be encrypted */
    auto *plaintext = (unsigned char *)"The quick brown fox jumps over the …
Run Code Online (Sandbox Code Playgroud)

php c++ encryption openssl

5
推荐指数
1
解决办法
1009
查看次数

如何使用 WebCryptoApi 从私钥导出公钥?

私钥是使用椭圆曲线生成的。Web Crypto API 的SubtleCrypto接口中的方法似乎都无法从私钥派生公钥,如果我错了,请纠正我。我必须使用第三方库吗?

javascript cryptography webcrypto-api

5
推荐指数
1
解决办法
1631
查看次数

如何从 RSA 私钥在 jwt 中设置 Kid 标头声明?

我想生成一个带有“kid”标头声明的 JWT 令牌。我有一个 XML 格式的 RSA 私钥来签署 JWT 令牌。但在我的 JWT 中,我找不到“kid”标头声明以及类型和 alg。我怎样才能做到这一点?

以下是生成 JWT 令牌的代码:

public async Task<IActionResult> Generate()
{
    var rsa = RSA.Create();
    string key = await System.IO.File.ReadAllTextAsync(options.PrivateKeyFilePath);
    rsa.FromXmlString(key);

    var credentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256);

    var jwt = new JwtSecurityToken(
        new JwtHeader(credentials),
        new JwtPayload(
            "webapi",
            "webapi",
            new List<Claim>(),
            DateTime.UtcNow,
            DateTime.UtcNow.AddHours(3)
        )
    );

    string token = new JwtSecurityTokenHandler().WriteToken(jwt);

    return Ok(new { Token = token });
}
Run Code Online (Sandbox Code Playgroud)

这是我的 RSA 私钥。

<RSAKeyValue>
<Modulus>yRfxNTDYqxjEgow6HHBPBEiK6NrVCyLFpG8dklP7f7kFuKZozHopqnly/24Gf6jt9xYLFIsQhhRcuclzEKNnBcWzKlXg9xRwk0o2JzPCh1Ifn1XQ67FrD8+HlBT9DfxjkvzCkPLxi8UWxgifIGauVeFbhIOkVfS0JrIJyQI33sUmiciBGXnO9CjEUpiBcoY53CRa49aUBoKJFDuHV2zuPWCEHLYXrP8Ns15jRU70V/YYUzU3R3PnWk3ZA/12YqtMAJaXFE33DQE71Ccd6HsXfUJpJAM81O/pDPDsk3b3260eN20nLDT0F2acOYQb/3bVKzqZ97isZYqekkmXdeuy4Q==</Modulus>
<Exponent>AQAB</Exponent>
<P>5iuGQcTqCvpwII6EOr1+F98GviZ/PWtHoDkiP8ZiSVCH8XEYCiuPmuWBtOYlv+hLJ9zWUVPkD5uIatLttT6ZxCi7oP+A6htgTbRyLN4NAibwtfQAKQOtue98HyIE6J17OPu8EVBXUSL9rC98OxcbxqDPLOX0geWoIt8BIE9v5js=</P>
<Q>36kW0+j+wHZyx6weriPO5xBAdYBmrd04rSM2hNEZETHMm30JzSYdfU3HATGYiCwexXGlioRMM6xm84DHkWo3Abqaeou2JRFR7PD3UTnsvYBxFxlTd4RfRcNvdvZHFkN4U1sik0FkYbSit6zGU2agEaegp5Jt0vT+CeDonMrUjZM=</Q>
<DP>INPGUy0FgElVop8Q5tvN1xO8/3O4JAdf8M8VPmlJ7VDqAppxpkmuMpZXGHjWm3dC+M17V6ASX9N78lhhBL+H6L0yfXTTaxA6fPqmahXFXzA0lo7VUwQuS92HI12Tu6VyRJ9KpGGEApNuAJfJLRhPotWelrW5WKlrgIWzwGrz968=</DP>
<DQ>A/1PI+6HBMXYHEmsrmyDF0oJ7E6jBjzo8uWq5kmYid76iFd9okQoyIBnqVTKJLusvNbfHg5oEY/ksjk81hIv8v7yHHd7g0PA01ok/zTqTSMKYWAZRgt9a5Al39hawkHn1ozMnBXRhZCkSmRxkTFGb6ouym5pORcXpPN3Erznd7M=</DQ>
<InverseQ>IOdFLHWNtVoAMGAp1wuHWqXIv0BnLnJSce7h+iwm3e165oiszxYa/k/UrMam8qlbjESBZM43oJwGyXtBFVjdTNxyugw5rF04xgrDtMjqb/ZxK1mdoidL15Ij/NZpbd5HtVZ8nzf38wRvMYIzZSA06/V5cYI2molR6gMcWEaClJw=</InverseQ>
<D>N1dzdmP+/PdP/W2CAJmX5WHheLvgrbPgGKTLyp16NWhB/tMtPDjShqvtzgYFm9RtyPY0Dm9HGN85tZePJyERFTGXYStJQjZJ1P8zcA56lqsvMLZ5TKQDBtLiSQqNqe+vp6AQG7wAZarT3aQ5xrz7dX8TpKBl9ZHmkk+lCcCmh5PVZYaRhYTfJp1vONjKKA1L/ivOxKKmjcQnky/A0Po24d8lI5iBLaCco6dThZqvDdfhbudkFnbTDIsb0K/NEqTlC9/XH59CKSUU+jwNY2B1P9MUodmqdi5sce3OIw9sffPcBaSypLiCEH8IvAFyZCWFuxR6zdSBOyQrfu4KNfcNEQ==</D>
</RSAKeyValue>
Run Code Online (Sandbox Code Playgroud)

c# rsa jwt

4
推荐指数
1
解决办法
3801
查看次数

如何在 Rust 中导出(存储)ecdsa 密钥对?

我能够在 Rust 中创建公共/私有 ecdsa 密钥,如何存储密钥以供进一步使用?我似乎找不到导出密钥的方法。

use p256::{ecdsa::{SigningKey, Signature, signature::Signer}};
use rand_core::OsRng; // requires 'getrandom' feature

fn main() {
    // Signing
    let signing_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()`
    let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
    let signature = signing_key.sign(message);


    // Verification
    use p256::ecdsa::{VerifyingKey, signature::Verifier};

    let verifying_key = VerifyingKey::from(&signing_key); // Serialize with `::to_encoded_point()`
    assert!(verifying_key.verify(message, &signature).is_ok());
}
Run Code Online (Sandbox Code Playgroud)

public-key rust ecdsa private-key

4
推荐指数
1
解决办法
1287
查看次数

在 php 和 vb.net 中加密和解密 AES 256

我需要能够加密和解密 php 和 vb.net 中的字符串。PHP 需要能够解密在 vb.net 中加密的字符串,而 vb.net 需要能够解密在 php 中加密的字符串。

我在两个环境中都有可以在该环境中工作的工作代码,但它们不能相互协作。

我对此进行了大量搜索,我相信这与 AES256 的 openssl 实现以及它与 IV 或类似的东西加盐的方式有关。

vb 实现为 IV 生成一个随机 GUID,并在对其进行 base64 编码之前将其添加到加密字符串中。

我的 vb.net 代码是这样的......

Imports System.IO
Imports System.Text
Imports System.Security.Cryptography


Public Class tbSecurity

Public Shared enckey = "00000000000000000000000000000000"
Public Shared Function AESEncryptStringToBase64(strPlainText As String) As String
    Dim Algo As RijndaelManaged = RijndaelManaged.Create()

    With Algo
        .BlockSize = 128
        .FeedbackSize = 128
        .KeySize = 256
        .Mode = CipherMode.CBC
        .IV = Guid.NewGuid().ToByteArray()
        .Key = Encoding.ASCII.GetBytes(enckey)
    End With …
Run Code Online (Sandbox Code Playgroud)

php vb.net openssl cryptography aes

3
推荐指数
1
解决办法
5775
查看次数

Nodejs `crypto.publicEncrypt` 不会采用 `ssh-keygen rsa` 生成的公钥

我曾经ssh-keygen rsa生成 RSA 密钥对。生成的公钥如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAA...
Run Code Online (Sandbox Code Playgroud)

当我尝试crypto在 Node.js 中使用来加密纯字符串时,

const fs = require('fs');
const { publicEncrypt } = require('crypto');

const publicKey = fs.readFileSync('$path/to/publicKey').toString();

const encryptedToken = publicEncrypt(publicKey, Buffer.from('some plain string'));
Run Code Online (Sandbox Code Playgroud)

它会给出以下错误:

Error: error:0909006C:PEM routines:get_name:no start line
  at node:internal/crypto/cipher:78:12
  ...
 library: 'PEM routines',
 function: 'get_name',
 reason: 'no start line',
 code: 'ERR_OSSL_PEM_NO_START_LINE'
Run Code Online (Sandbox Code Playgroud)

我对密码学非常陌生,只知道公钥/私钥加密的一般概念,因此非常感谢任何建议。

编辑:

我知道它crypto附带了生成密钥对的方法,所以我想问题更多是关于为什么公钥ssh-rsa在这里不起作用。

rsa node.js cryptojs

2
推荐指数
1
解决办法
3036
查看次数

如何将有效值传递到cleartext_keyset_json以创建Tink密钥

在 Tink 中,可以将明文密钥集加载和写入为 json。下面是一个非工作示例:

{
  "primaryKeyId": 2800579,
  "key": [
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "ODA9eJX9wcAGwZocL0Jym==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "ENABLED",
      "keyId": 2800579,
      "outputPrefixType": "TINK"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 是否可以将您自己的值插入到各种键/值对中以获得另一个有效的键集?我已经对此进行了实验,但没有取得太大成功 - 主要是因为“value”键抱怨INVALID_ARGUMENT: Could not parse key_data.value as key type 'type.googleapis.com/google.crypto.tink.AesGcmKey'知道有效的“value”是什么吗?

python cryptography tink

2
推荐指数
1
解决办法
747
查看次数

如何从 ECDsa 或 ECDsaCng 对象中提取文本私钥和公钥?

创建 ECDSA 对象并尝试提取私钥和公钥对象时,它会返回一个byte[]. 但是当尝试将其转换为字符串时,它给出的输出看起来不正确。

// Creating the object with default parameters
ECDsa ecdSa = ECDsa.Create(ECCurve.NamedCurves.nistP256);

// Export parameters
ECParameters ecParamters = ecdSa.ExportParameters(true);

// Private Key
byte[] privateKey = ecParamters.D;

// Public key params
ECPoint publicKey = ecParamters.Q;

// Coordinates
byte[] publicKeyX = publicKey.X; // What format? int, double, etc
byte[] publicKeyY = publicKey.Y; // What format? int, double, etc
Run Code Online (Sandbox Code Playgroud)

上面提供了对,和 的ECParameters访问。curveD (private key)Q (public key)

知道这些字节数组中使用了哪种格式吗?我们如何将其转换为字符串格式,例如:私钥和公钥到PKCS#8

.net c# cryptography ecdsa .net-6.0

2
推荐指数
1
解决办法
3903
查看次数

从 C# 到 PHP 的函数

我需要将这些用 C# 开发的加密系统转换为 PHP。这些是输入数据。客户 ID、转换为字符串的 JSON 对象和私钥。

codigoCliente: 1002

数据:{"codigoCliente":1002,"codigoArticulo":"30-07483","cantidad":1}

claveSecretaServicio:RFlTfDIwMjBXZWJQYWdlX0V4dGVybmF

我需要得到这个哈希结果:WGHGEY830J3WeadO1o4NGNLYZ9lY7xvquol5igE+hLU=

这是 C# 中的调用:GetHash(modelo.CodigoCliente.ToString(), JsonSerializer.Serialize(modelo), “WGHGEY830J3WeadO1o4NGNLYZ9lY7xvquol5igE+hLU=”);

转换为 PHP 的 C# 函数是这些。

public static string GetHash(string codigoCliente, string datos, string claveSecretaServicio)
{
    var claveSecretaBytes = System.Convert.FromBase64String(claveSecretaServicio);
    var claveOperacion = Encrypt3DES(codigoCliente, claveSecretaBytes);
    var firmaBytes = GetHMACSHA256(datos, claveOperacion);
    return System.Convert.ToBase64String(firmaBytes);
}

private static byte[] Encrypt3DES(string codigoCliente, byte[] key)
{
    var codigoClienteBytes = System.Text.Encoding.UTF8.GetBytes(codigoCliente);
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    byte[] SALT = new byte[8] { 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

php c# encryption

-3
推荐指数
1
解决办法
214
查看次数