从Objective-c中以字节为单位的模和指数生成RSA公钥
我搜索了很多网站,试图了解RSA是如何工作的 我有一个模数“A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BB12F97DED70AE5E4480FC9E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E920C1C529276D8AF8EC7F28492097D8CD5ECEA16F4088F6CFAB4A1B4228A1B996F9278B07E3311CEF8588474B8E40780E40780E40780F”和“CD40780E40780E40780E40780E40780E40780B8B8B7B8B7D8E40780E40780F”指数指数我必须解密十六进制字节格式的信息。我的问题是: 如何创建公钥?从Objective-c中以字节为单位的模和指数生成RSA公钥,objective-c,openssl,rsa,modulus,exponent,Objective C,Openssl,Rsa,Modulus,Exponent,我搜索了很多网站,试图了解RSA是如何工作的 我有一个模数“A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BB12F97DED70AE5E4480FC9E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E920C1C529276D8AF8EC7F28492097D8CD5ECEA16F4088F6CFAB4A1B4228A1B996F9278B07
一旦我有了公钥,我必须用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)