当前位置: 首页 > 知识库问答 >
问题:

在Objective-c中用字节为单位的模和指数生成RSA公钥

郎睿
2023-03-14

我搜索了许多网站,试图了解RSA是如何工作的。

我有一个模数“856C2F888474B83612A82E4E00D0CD4069A6783140433D50725F”和指数“03”,我必须解密以十六进制字节组成的信息。我的问题是:

如何创建公钥?一旦我有了公钥,我必须在base64中编码还是公钥准备解密?

共有1个答案

秦斌
2023-03-14

经过几天的研究,我终于用OpenSSL完成了。我不是C++方面的专家,所以我不确定是否所有的字符、常量字符和无符号字符都声明正确,所以如果有人有更好的想法,请编辑它=)。你必须有lybcrypto.a和libssl.a(在这里你可以找到它们https://github.com/x2on/openssl-for-iphone)。我用EMV VISA密钥测试了几次,它有效。

#include <openssl/opensslv.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bn.h>

@implementation ViewController

-(NSData*) decryptIPKC:(NSString*)ipkc modulus:(NSString*)mod exponent:(NSString*)exp{

NSString * hexString = ipkc;
int hexStringLength= [hexString length] / 2;

//unsigned char enc_bin[144];
unsigned char dec_bin[hexStringLength];
//int enc_len;
int dec_len;
RSA * rsa_pub = RSA_new();


const char *N=[mod UTF8String] ;
const char *E=[exp UTF8String];



char * myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
bzero(myBuffer, [hexString length] / 2 + 1);
for (int i = 0; i < [hexString length] - 1; i += 2) {
unsigned int anInt;
NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];
[scanner scanHexInt:&anInt];
myBuffer[i / 2] = (char)anInt;
}

printf("Mybuffer: %s",myBuffer);

if (!BN_hex2bn(&rsa_pub->n, N)) {
printf("NO CARGO EL MODULO");
}
printf(" N: %s\n", N);
printf(" n: %s\n", BN_bn2hex(rsa_pub->n));


if (!BN_hex2bn(&rsa_pub->e, E)) {
printf("NO  CARGO EL EXPONENTE");
}
printf(" E: %s\n", E);
printf(" e: %s\n", BN_bn2hex(rsa_pub->e));

printf("public key size : %d bits\n", RSA_size(rsa_pub));    

/* decrypt */
if ((dec_len = RSA_public_decrypt(hexStringLength, (unsigned char*)myBuffer, dec_bin, rsa_pub,RSA_NO_PADDING))<0) {
printf("NO\n ");
}
printf("decrypted data:\n %s", dec_bin);
print_hex(dec_bin, dec_len);

NSData* data = [NSData dataWithBytes:dec_bin length:sizeof(dec_bin)];

free(myBuffer);

return data;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString *m= @"Your HEX modulus here";
NSString *e=@"Your HEX exponent";
NSString * hexString= @"Your HEX message here";

NSData *decryptedIPKC= [self decryptIPKC:hexString modulus:m exponent:e];
NSLog(@"ESTE ES EL NSDATA %@", decryptedIPKC.description);
}

@end
 类似资料:
  • 我在Android中生成了一个公共私钥对。现在我需要将我的公钥发回服务器,以便用RSA加密进行通信。但是,我正在与一个。NET服务器(用C)进行通信。因此,我需要以以下格式发送我的公钥: 我用以下代码生成密钥对: 我如何提取我刚刚生成的公钥的模和指数?

  • 我有一个公钥是: 作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为作为一家专业人士

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 我在做一个有密钥交换算法的套接字程序。该算法与SSL密钥在web浏览器和web服务器之间的交换非常相似。这些是这个算法中的步骤。 null 如何将字节数组更改为RSA公钥? 或者还有其他恢复RSA公钥的方法吗?像java中的键工厂方法吗?

  • 我使用我编写的程序生成了一个 PKCS#1 RSA 密钥对。我已经输出公钥作为 ASN.1数据结构的DER编码。 然而,当我试图在OpenSSL 和< code>rsautl命令中使用它时,OpenSSL说 我尝试过DER和PEM格式。 是否有额外的编码和/或数据结构需要我申请才能在OpenSSL中使用? 这是我的命令行: PEM 格式的公钥数据结构