2014-09-02 2 views
0

XML 형식의 C#에서 공유하는 PublicKey (2048 비트) 데이터에서 SecKeyRef를 생성하려고합니다. 데이터는 다음과 같다 : I 키 만 1024 비트 동작하지만 동일한 로직이 상기 키 (2048 비트)로 인코딩 DER에 실패하는 Convert XML Dsig format to DER ASN.1 public key 링크를 따랐다RSA 공개 키 (2048 비트)를 XML 형식에서 DER ASN.1 iOS 공개 키로 변환

<Modulus>yLgpOFtg14GjDdle0xha2JCbYrpmKCpXcv+zFx2pi6OlIF8cOSXF6dE19W15+WfuCc2SznVQlVDOLp/NlPGLXKN5L47XYQrPpcls8/xp2PYYW7hjezx7Ig6+WDJnUxSbWgxZQMaiyO1XbCKll5yT2AxUj4od/DfylsVe8ljq154rEb+vCjr/LDpxExijHouJYDNqFV1jglWHWfftBQAzEZADPx7NpHsgXSYrFeVY/WH38GIlyO8FvGWIuDiwyRrHUEXhljmBqAJ3lgULyik3ShfjpN1W4h7BbzFs27mpiAPMtPgToADPNzOadRWFJQjeVVknIq5g6SHHnaZK8wBwrQ==</Modulus><Exponent>AQAB</Exponent>]]>"

. 덧붙여서, 변환 논리가 256 바이트 키로 수정 될 필요가 있음을 알았지 만, 변경으로 성공할 수는 없습니다!

나는 또한 Generate Public Key From Modulus & Exponent on iOS using OpenSSL 라이브러리를 사용해 보았지만 이것으로 RSA 객체를 생성하지 못했습니다!

NSString *mod = @"yLgpOFtg14GjDdle0xha2JCbYrpmKCpXcv+zFx2pi6OlIF8cOSXF6dE19W15+WfuCc2SznVQlVDOLp/NlPGLXKN5L47XYQrPpcls8/xp2PYYW7hjezx7Ig6+WDJnUxSbWgxZQMaiyO1XbCKll5yT2AxUj4od/DfylsVe8ljq154rEb+vCjr/LDpxExijHouJYDNqFV1jglWHWfftBQAzEZADPx7NpHsgXSYrFeVY/WH38GIlyO8FvGWIuDiwyRrHUEXhljmBqAJ3lgULyik3ShfjpN1W4h7BbzFs27mpiAPMtPgToADPNzOadRWFJQjeVVknIq5g6SHHnaZK8wBwrQ==";

BIGNUM *modulus = BN_new(); 
int res = BN_hex2bn(&modulus,[mod cStringUsingEncoding:NSUTF8StringEncoding]); 

BIGNUM *exponent = BN_new(); 
NSString *exp = @"AQAB"; 
res = BN_hex2bn(&exponent,[exp cStringUsingEncoding:NSUTF8StringEncoding]); 

RSA *rsa = RSA_new(); 

rsa->n = BN_new(); 
BN_copy(rsa->n,modulus); 
rsa->e = BN_new(); 
BN_copy(rsa->e,exponent); 
rsa->iqmp=NULL; 
rsa->d=NULL; 
rsa->p=NULL; 
rsa->q=NULL; 

FILE *fp = fopen("/publicKey.pem", "wb"); 
int suc = PEM_write_RSAPublicKey(fp, rsa, NULL, NULL, 0, 0, NULL); 

생성 된 publicKey.pem 파일이 분명히 비어 : 아래는 샘플입니다! 누구나 XML RSA 공개 키를 iOS SecKetRef 객체로 가져올 수 있다면 좋을 것입니다.

미리 감사드립니다.

답변

1

위의 두 가지 방법으로이 문제를 성공적으로 해결할 수있었습니다. 여기 내 해결책은 다음과 같습니다 :

Approach # 1. 변환 XML 키는 ASN.1 DER 형식으로이 링크와 함께 256 바이트 키 (2048 비트)로 작업했습니다. https://github.com/meinside/iphonelib/blob/master/security/CryptoUtil.m#L67

접근 # 2. 성공적으로 RSA 객체와 암호화 수 (참조 : Generate Public Key From Modulus & Exponent on iOS using OpenSSL) 다음 코드로 생성 :

`는 NSString * 모드 = @ "yLgpOFtg14GjDdle0xha2JCbYrpmKCpXcv + zFx2pi6OlIF8cOSXF6dE19W15 + WfuCc2SznVQlVDOLp/NlPGLXKN5L47XYQrPpcls8/xp2PYYW7hjezx7Ig6 + WDJnUxSbWgxZQMaiyO1XbCKll5yT2AxUj4od/DfylsVe8ljq154rEb + vCjr/LDpxExijHouJYDNqFV1jglWHWfftBQAzEZADPx7NpHsgXSYrFeVY/WH38GIlyO8FvGWIuDiwyRrHUEXhljmBqAJ3lgULyik3ShfjpN1W4h7BbzFs27mpiAPMtPgToADPNzOadRWFJQjeVVknIq5g6SHHnaZK8wBwrQ == ";

NSString * exp = @ "AQAB";

NSData *modBits = [[NSData alloc] initWithBase64EncodedString:mod options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
NSData *expBits = [[NSData alloc] initWithBase64EncodedString:exp options:NSDataBase64DecodingIgnoreUnknownCharacters]; 

unsigned char *modBin = (unsigned char *)malloc(modBits.length); 
[modBits getBytes:modBin length:modBits.length]; 

unsigned char *expBin = (unsigned char *)malloc(expBits.length); 
[expBits getBytes:expBin length:expBits.length]; 


BIGNUM *returnValue = BN_new(); 
BIGNUM *modulus = BN_bin2bn(modBin, modBits.length, returnValue); 
BIGNUM *exponent = BN_bin2bn(expBin, expBits.length, NULL); 

RSA *rsa = RSA_new(); 
rsa->n = BN_new(); 
BN_copy(rsa->n,modulus); 
rsa->e = BN_new(); 
BN_copy(rsa->e,exponent); 
rsa->iqmp=NULL; 
rsa->d=NULL; 
rsa->p=NULL; 
rsa->q=NULL; 


unsigned char *orgTxt = (unsigned char*)strdup("Hello World"); 

int lenrsa = RSA_size(rsa) - 11; // man RSA_public_encrypt for the -11 

unsigned char *encrText = (unsigned char *)malloc(lenrsa); 
int result = RSA_public_encrypt(strlen((const char*)orgTxt), orgTxt, encrText, rsa,RSA_PKCS1_PADDING); 

Be sure of the glen param of RSA_public_encrypt API, it depends on the padding used. man RSA_public_encrypt` 자세한 내용은 다음을 참조하십시오.