Tag: rsa

RSA加密的OpenSSL可变长度结果

我正在尝试使用OpenSSL的RSA加密function加密一些文本。 我的主要问题是加密的RSA文本的长度在0到256之间变化。 我的RSA加密function是: /* Encrypt data using RSA */ char* rsa_encrypt(char* pub_key_filename, const unsigned char *data) { int padding = RSA_PKCS1_PADDING; FILE *fp_pub; fp_pub = fopen(pub_key_filename, “rb”); if (fp_pub == NULL) { printf(“There was an error opening the public key file. Exiting!\n”); exit(EXIT_FAILURE); } RSA *pub_key = PEM_read_RSA_PUBKEY(fp_pub, NULL, NULL, NULL); char *encrypted = malloc(2048); […]

内核非对称加密中的crypto_akcipher_set_pub_key总是返回错误

我正在研究一个内核模块,它使用内核crypto api的非对称密码,内核版本为4.8.0。 我通过openssl生成非对称密钥对,将它们转换为DER格式(我知道它是BER的一个子集),并将代码编入我的模块。 私钥工作得很好,但是公钥在crypto_akcipher_set_pub_key中总是失败,即使我尝试了更多其他密钥对。 dmesg只是打印: [16891.604718] next_op: pc=0/10 dp=0/161 C=0 J=0 [16891.604721] – match? 30 30 00 [16891.604724] – TAG: 30 158 CONS [16891.604726] next_op: pc=2/10 dp=3/161 C=1 J=0 [16891.604727] – match? 30 02 32 [16891.604729] ASN1: Unexpected tag [m=2 d=4 ot=02 t=30 l=158] [16891.604730] set key error! -74,,,,,0 这是我的问题: A)dmesg是否意味着公钥是错误的? 如何生成内核加密兼容密钥对? B)我找不到内核非对称密码的可用rsa密钥对,即使在Linux / crypto […]

RSA_private_encrypt总是失败

我正在学习在我的程序中使用OpenSSL库。 在代码中我生成一个私钥,我立即使用该密钥加密消息。 但总是失败。 请帮助我。 private_key = RSA_generate_key(RSA_KEY_LENGTH, RSA_3, NULL, NULL); if (RSA_check_key(private_key) < 1) { printf("generate_key: key generation failed\n"); exit(-1); } unsigned char msg[25]; unsigned char cipher[128]; strcpy((char*)msg, "hello"); int ret = RSA_private_encrypt(25, msg, cipher, private_key, RSA_PKCS1_OAEP_PADDING); if (ret < 0) { printf("encryption in key generation failed\n"); printf ("%s\n", ERR_error_string (ERR_get_error (), (char *) cipher)); […]

使用c进行rsa加密解密

我正在尝试使用Open SSL编写RSA加密和解密的C代码。 但我无法这样做。 我用谷歌搜索了它,但无论我从互联网上得到什么代码,它都是我的头脑。 mainfunction在这里,我从堆栈溢出。 我尝试过使用它……但它不起作用。 可能是我的坏事。 encrypt(FILE *rsa_Pkey_fole,FILE *in_file,FILE *out_file){ } int main(int argc, char *argv[]) { FILE *rsa_pkey_file, *infile; int rv; if (argc < 2) { fprintf(stderr, "Usage: %s \n”, argv[0]); exit(1); } rsa_pkey_file = fopen(argv[1], “rb”); infile = fopen(argv[2], “w”); if (!rsa_pkey_file) { perror(argv[1]); fprintf(stderr, “Error loading PEM RSA Public Key File.\n”); […]

使用OpenSSL生成RSA公钥/私钥?

主要的问题是我对C很新,OpenSSL文档对我来说还不够清楚,我尝试过用RS读取和写入一个pem文件的rsa键 ,但我不太明白。 例如, create_rsa_key()函数如何创建私有和公共? pCipher来自哪里? 那个pcszPassphrase什么pcszPassphrase呢? 我会解释好像它是某种伪代码,这就是我想做的事情,粗体部分是那些我不知道怎么做的部分: 生成私钥和公钥作为hex缓冲区(客户端) 安全地将公钥发送到另一个端点(客户端) 使用AES256 CBC(服务器)使用随机256位密码加密某些数据 使用公钥(服务器)加密密码 将加密数据发送到客户端(服务器) 使用私钥(客户端)解密加密的256位密码 解密文件 基本上我知道如何处理AES加密/解密和通信协议,它们已经实现了,我的问题是RSA,我需要hex格式而不是base64或pem,因为我正在使用套接字并发送和存储为二进制数据。

没有动态分配的RSA的实现

典型的RSA实现包含多精度整数库。 典型的多精度整数库使用动态分配将大整数表示为正确大小的机器字数组。 我希望在使用多精度整数时,只有加密或解密已知长度的消息(通常是对称加密密钥)时才会遇到数学整数的限制,例如RSA-2048,它会是可以通过静态地或在堆栈上为所有必要的中间结果分配空间来实现算法。 我发现这个论坛post暗示这是可能的。 它不表示最大整数大小。 也许这很明显(“所有整数都需要2048位,呃!”)。 无论如何,如果有的话,我会对现有的实现更感兴趣。 作为一个不值得自己进入的副问题,椭圆曲线加密的典型实现是否需要动态分配?

如何使用RSA加密/解密长输入消息?

我写了一个简单的测试程序来加密/解密消息。 我有一个keylength : int keylength = 1024; // it can also be 2048, 4096 和最大输入长度: int maxlen = (keylength/8)-11; 我知道我的输入大小应该<而不是maxlen,如下所示: if(insize >= maxlen) printf(“cannot encrypt/decrypt!\n”); 我的问题很简单 – 是否有可能(如果是这样,我该怎么做)使用比maxlen RSA消息加密/解密? 主要代码也非常简单但仅在insize <maxlen时有效: if((encBytes=RSA_public_encrypt(strlen(buff1)+1, buff1, buff2, keypair, RSA_PKCS1_PADDING)) == -1) { printf(“error\n”); } if((decBytes=RSA_private_decrypt(encBytes, buff2, buff3, keypair, RSA_PKCS1_PADDING)) == -1) { printf(“error\n”); }

C中的OpenSSL“Seal”(或通过shell)

我正在努力将一些PHP代码移植到C,它与Web API联系。 我遇到的问题是PHP代码使用函数openssl_seal() ,但我似乎无法找到任何方法在C中执行相同的操作,甚至在调用system()通过openssl 。 从openssl_seal()上的PHP手册: int openssl_seal(string $ data,string&$ sealed_data,array&$ env_keys,array $ pub_key_ids) openssl_seal()使用带有随机生成的密钥的RC4密封(加密)数据。 密钥使用与pub_key_ids中的标识符相关联的每个公钥加密,并且每个加密密钥在env_keys中返回。 这意味着可以向多个收件人发送密封数据(前提是已获得其公钥)。 每个收件人必须同时接收密封数据和使用收件人公钥加密的信封密钥。 实现这个的最佳方法是什么? 出于显而易见的原因,我真的不想每次都调用PHP脚本。

用于在C / C ++中实现RSA的开源代码(使用库或自己编写)

我需要用于RSA实现的开源代码(加密/解密和其他)。 谁能提出一些建议。 编辑:使用像opessl这样的开源库或者自己编写它是否很好(库也包含其他冗余的东西)

validationOpenSSL 0.9.8a中的RSA签名

我正在开发基于OpenSSL 0.9.8a API的应用程序,我需要使用RSA公钥pubkeyvalidationRSA签名(4096位RSA密钥)。 这是我的代码: const EVP_MD* md = EVP_get_digestbyname(“SHA512”); if (!md) { return false; } if(EVP_DigestInit_ex(ctx, md, NULL)<=0) { return false; } if(EVP_DigestVerifyInit( ctx, NULL, md, NULL, pubKey)<=0) { return false; } if (EVP_DigestUpdate(ctx, Msg, MsgLen) <= 0) { return false; } int res = EVP_DigestFinal_ex(ctx, MsgHash, &MsgHashLen); 问题是EVP_DigestVerifyInit函数未在openssl0.9.8a中定义。 是否有其他方法可以在早于OpenSSL 1.0.0版本的版本中validationRSA签名? 以下是我的输入:/ * Text_message保存到“sample.txt”文件(文本以最后一个字符’\ n’结尾)* […]