C android互通RSa加密,android使用rsa加密 在本土C代码中使用openssl签名结果和java中不同...
时间: 2023-12-10 14:42:18 浏览: 205
这种情况可能是由于编码和字节顺序不同导致的。在Android中,RSA加密通常使用Java的JCE(Java Cryptography Extension)库,而在本地C代码中通常使用OpenSSL库。
在使用RSA加密时,重要的是确保在加密和解密过程中使用相同的编码和字节顺序。在Java中,通常使用的是Big-endian字节顺序,而在C中通常使用的是Little-endian字节顺序。
为了解决这个问题,你可以尝试在C代码中强制指定使用Big-endian字节顺序。可以使用htons函数将16位的整数从主机字节顺序转换为网络字节顺序,或使用htonl函数将32位的整数从主机字节顺序转换为网络字节顺序。
具体的代码实现可以参考以下示例:
```
// 在C代码中使用Big-endian字节顺序
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <arpa/inet.h>
// 将16位整数从主机字节顺序转换为网络字节顺序
uint16_t hton16(uint16_t x) {
return htons(x);
}
// 将32位整数从主机字节顺序转换为网络字节顺序
uint32_t hton32(uint32_t x) {
return htonl(x);
}
// RSA加密
int rsa_encrypt(unsigned char *in, int inlen, unsigned char *out, int outlen, RSA *rsa) {
int ret = 0;
BIGNUM *bn_in = NULL;
BIGNUM *bn_out = NULL;
bn_in = BN_bin2bn(in, inlen, NULL);
if (bn_in == NULL) {
return -1;
}
bn_out = BN_new();
if (bn_out == NULL) {
BN_free(bn_in);
return -1;
}
// 强制使用Big-endian字节顺序
BN_set_flags(bn_in, BN_FLG_MSB_FIRST);
ret = RSA_public_encrypt(inlen, bn_in->d, bn_out->d, rsa, RSA_PKCS1_PADDING);
if (ret > 0 && ret <= outlen) {
// 将结果转换为Big-endian字节顺序
BN_set_flags(bn_out, BN_FLG_MSB_FIRST);
ret = BN_bn2bin(bn_out, out);
ret = outlen - ret;
} else {
ret = -1;
}
BN_free(bn_in);
BN_free(bn_out);
return ret;
}
```
在使用时,可以将Java中加密的结果转换为Big-endian字节顺序,然后在C中使用上述代码进行解密。
阅读全文