繁体   English   中英

如何使用ASN.1 x509字节数组中的RSA公钥加密字符串?

[英]How do I encrypt a string with an RSA public key from a ASN.1 x509 Byte array?

我有一个ASN.1 x509字节数组,其中包含RSA对的模和公钥。 我的目标是尽一切可能使用它来加密字符串。 我正在尝试在Objective-C中使用openssl来完成此任务。 每当我尝试使用d2i_X509获取RSA对象时,它都会返回null。 如果我无法使用openssl完成此操作,则愿意切换到其他库。 请帮助我找到可行的方法。

通常,您不会直接使用X.509的公钥加密字符串。 相反,您将生成一个强(特定质量)随机密钥; 使用普通的对称加密(例如AES),然后使用该字符串对字符串进行加密。 然后,您使用X.509加密随机密钥。

关于原因(有关密钥泄漏,位翻转,填充和(重新)的部分),请查阅一本好的PKI /加密书(例如http://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099 )。 )加密两次)。

如果您真的坚持要执行此操作, 查看https://github.com/dirkx/smime-add-encryption-for-recipient/blob/master/smime-add-encrypt/main.c及其pkcs7_encode_rinfo函数。

x509cert = ... something to read your x509 byte array in.

unsigned char *stuff = "Some zecret string";
int stufflen = strlen(stuff);

EVP_PKEY *pkey;
EVP_PKEY_CTX *pctx = NULL;

assert(pkey =  = X509_get_pubkey( x509cert));
assert(pctx = EVP_PKEY_CTX_new(pkey, NULL));
assert(EVP_PKEY_encrypt_init(pctx)==1);
assert((EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT
                      EVP_PKEY_CTRL_PKCS7_ENCRYPT, 0, ri)==1);

size_t eklen;
assert(EVP_PKEY_encrypt(pctx, NULL, &eklen, stuff, stufflen)==1);

ek = OPENSSL_malloc(eklen);
assert(ek);

unsigned char *ek = NULL;
assert((EVP_PKEY_encrypt(pctx, ek, &eklen, key, keylen)==1);

printf("Encrypted blurp: ");
for(int i = 0; i < eklen; i++) {
    printf("0x%02X ", ek[i];
};
printf("\n");
exit(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM