Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Objective-c中以字节为单位的模和指数生成RSA公钥_Objective C_Openssl_Rsa_Modulus_Exponent - Fatal编程技术网

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

从Objective-c中以字节为单位的模和指数生成RSA公钥,objective-c,openssl,rsa,modulus,exponent,Objective C,Openssl,Rsa,Modulus,Exponent,我搜索了很多网站,试图了解RSA是如何工作的 我有一个模数“A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BB12F97DED70AE5E4480FC9E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E920C1C529276D8AF8EC7F28492097D8CD5ECEA16F4088F6CFAB4A1B4228A1B996F9278B07

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

我有一个模数“A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BB12F97DED70AE5E4480FC9E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E920C1C529276D8AF8EC7F28492097D8CD5ECEA16F4088F6CFAB4A1B4228A1B996F9278B07E3311CEF8588474B8E40780E40780E40780F”和“CD40780E40780E40780E40780E40780E40780B8B8B7B8B7D8E40780E40780F”指数指数我必须解密十六进制字节格式的信息。我的问题是:

如何创建公钥?
一旦我有了公钥,我必须用base64编码还是公钥可以解密?

经过几天的研究,我终于用OpenSSL实现了。我不是C++专家,所以我不能肯定所有字符、const字符和未签名字符是否正确声明,所以如果有人有更好的想法,请编辑它=)。您必须有lybcrypto.a和libssl.a(在这里可以找到它们)。我用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
#包括
#包括
#包括
#包括
@实现视图控制器
-(NSData*)解密ipkc:(NSString*)ipkc模:(NSString*)模指数:(NSString*)exp{
NSString*hexString=ipkc;
int hexStringLength=[hexString length]/2;
//未签名字符enc_bin[144];
无符号字符dec_bin[hexStringLength];
//国际恩库伦;
国际数据中心;
RSA*RSA_pub=RSA_new();
常量字符*N=[mod UTF8String];
常量char*E=[exp UTF8String];
char*myBuffer=(char*)malloc((int)[hextstring length]/2+1);
bzero(myBuffer,[hextstring length]/2+1);
对于(int i=0;i<[hextstring length]-1;i+=2){
无符号整数;
NSString*hexCharStr=[hexString substringWithRange:NSMakeRange(i,2)];
NSScanner*scanner=[[NSScanner alloc]initWithString:hexCharStr];
[扫描仪扫描点:&anInt];
myBuffer[i/2]=(char)anInt;
}
printf(“我的缓冲区:%s”,我的缓冲区);
如果(!BN_hex2bn(&rsa_pub->n,n)){
printf(“无货物EL模”);
}
printf(“N:%s\N”,N);
printf(“n:%s\n”,BN_bn2hex(rsa_pub->n));
如果(!BN_hex2bn(&rsa_pub->e,e)){
printf(“无货物EL指数”);
}
printf(“E:%s\n”,E);
printf(“e:%s\n”,BN_bn2hex(rsa_pub->e));
printf(“公钥大小:%d位\n”,RSA_大小(RSA_pub));
/*解密*/

如果((dec_len=RSA_public_decrypt(hexStringLength,(unsigned char*)myBuffer,dec_bin,RSA_pub,RSA_NO_PADDING))我在这行中遇到崩溃-printf(“解密数据:\n%s,dec_bin);&print_hex(dec_bin,dec_len)-这一行给了我执行中的错误。任何其他我需要包含的用于打印的库?请帮助我。如果可能,请共享您的代码我的电子邮件id-meshram。nitesh@gmail.comHi现在这段代码对我来说非常好。我还需要你的帮助。我在这行printf(“Mybuffer:%s”,Mybuffer)得到了正确的输出;但是,当我试图转换字符串中的“decryptedIPKC”时,我没有得到空值。这是我的代码NSString*newStr=[NSString stringWithUTF8String:[decryptedIPKC bytes]];。谢谢。这应该通过TestOhexString:(NSData*)NSData{if(NSData==nil){return nil;}//Byte*bData=(Byte*)[NSData Byte*];NSMutableString*hextString=[NSMutableString];const unsigned char*p=[nsData bytes];for(int i=0;i)