Tag: 密码学

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); […]

OpenSSL SHA1没有validationNIST SHAKE测试向量?

我编写了一个C代码,它调用OpenSSL SHA1来生成摘要,但我生成的摘要不匹配。 #define MSG_SIZE 190 #include #include #include void str2hex(char *str, unsigned char *hex, int len) { int tt, ss; char temp[5]; for (tt = 0, ss = 0; tt < len, ss < 2 * len; tt++, ss += 2) { temp[0] = '0'; temp[1] = 'x'; temp[2] = str[ss]; temp[3] = str[ss + […]

使用AES-128 / CBC时,EVP_DecryptFinal_ex中的间歇性解密失败

我正在使用此处的EVP库: https : //www.openssl.org/docs/manmaster/crypto/EVP_EncryptInit.html 这是我的两个加密和解密function: 我正在尝试使用AES 128 CBC加密字符串。 该字符串的格式通常为word1 word2 word3 char* encrypt(char *s, char *key) { unsigned char iv[16] = {[0 … 15 ] = 0}; unsigned char outbuf[1024] = {[0 … 1023] = 0}; int outlen1, outlen2; EVP_CIPHER_CTX ctx; EVP_CIPHER_CTX_init(&ctx); EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv); if (EVP_EncryptUpdate(&ctx, outbuf, &outlen1, s, strlen(s)) == 1) […]

如何在C中使用ISAAC

我从这里下载了isaac64,我的使用有些问题。 我不得不在isaac64.c中评论部分代码,因为它包含main函数。 但我无法使用它…我无法正确初始化它并得到随机数,你能帮助我吗? 我找不到任何例子。 randinit(TRUE); 对于(I = 0; I <10;我++){ 的printf( “%LX \ n” 个,兰特()); } 每次运行此代码时,我都会得到相同的值。 我不知道怎么设种子。

C中的MD4实现 – 一致但错误的输出

我似乎无法让我的md4实现工作。 关于什么是错的任何想法? 另外,我不是在这个项目被分配到的class级。我只是为了踢。 我也宁愿你给我提示而不是直截了当的回答。 谢谢! 编辑:具体(我知道),我的输出与RFC1320提供的测试向量不匹配。 例如: From RFC — MD4 (“abc”) = a448017aaf21d8525fc10ae87aa6729d Mine — DIGEST: ed763b1deb753a9d8fc7e3f1a653a954 — 32 BYTES 但是,我从输出哈希值(32字节)中获取正确的大小 如果还有其他我需要澄清的内容,请发表评论! /** hThreat @ http://auburn.edu/~dac0007/blog/ “MD4 hashing algorithm — beginning project 1” **/ // References //http://tools.ietf.org/html/rfc1320 #include #include #include #include // define 3 auxiliary functions (Copied from RFC1320) #define F(x, y, z) (((x) […]

使用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”); }

MD5加密API为某些明文返回错误的哈希值

我正在尝试使用Microsoft加密API来计算MD5哈希值,但是我得到的哈希值不正确: #include #include #include char* HashMD5(char* data, DWORD *result) { DWORD dwStatus = 0; DWORD cbHash = 16; int i = 0; HCRYPTPROV cryptProv; HCRYPTHASH cryptHash; BYTE hash[16]; char *hex = “01234567879abcdef”; char *strHash = “00000000000000000000000000000000”; if(!CryptAcquireContext(&cryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { dwStatus = GetLastError(); printf(“CryptAcquireContext failed: %d\n”, dwStatus); *result = dwStatus; return NULL; } […]

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’结尾)* […]