简体   繁体   中英

RSA/ECB/PKCS1Padding iOS encryption

I am currently stuck at a problem which involves encryption in iOS.

My client has given me the public key,

"-----BEGIN PUBLIC KEY-----
xxxx
-----END PUBLIC KEY-----"

The padding strategy that needs to be used is RSA/ECB/PKCS1Padding. With android, it seems pretty straight forward

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedBytes = cipher.doFinal(plain.getBytes());

return encryptedBytes;

I dont see any direct methods to do this in iOS. Any of the common pods used like Commoncrypto doesnt allow me to force PKCS1 padding scheme. Being a pretty inexperienced guy with RSA and encryption, it would be very much appreciated if you could help me understand on how to approach this and guide me through this.

使用标准的安全框架- SecKeyEncryptkSecPaddingPKCS1参数

My issue was solved using non padding :

kSecPaddingNone

-(SecKeyRef)getPublicKeyForEncryption
{
    NSString *thePath = [MAuthBundle pathForResource:@"certificate" ofType:@"der"];

    //2. Get the contents of the certificate and load to NSData
    NSData *certData = [[NSData alloc]
                        initWithContentsOfFile:thePath];

    //3. Get CFDataRef of the certificate data
    CFDataRef myCertData = (__bridge CFDataRef)certData;

    SecCertificateRef myCert;
    SecKeyRef aPublicKeyRef = NULL;
    SecTrustRef aTrustRef = NULL;

    //4. Create certificate with the data
    myCert = SecCertificateCreateWithData(NULL, myCertData);

    //5. Returns a policy object for the default X.509 policy
    SecPolicyRef aPolicyRef = SecPolicyCreateBasicX509();

    if (aPolicyRef) {
        if (SecTrustCreateWithCertificates((CFTypeRef)myCert, aPolicyRef, &aTrustRef) == noErr) {
            SecTrustResultType result;
            if (SecTrustEvaluate(aTrustRef, &result) == noErr) {
                //6. Returns the public key for a leaf certificate after it has been evaluated.
                aPublicKeyRef = SecTrustCopyPublicKey(aTrustRef);
            }
        }
    }

    return aPublicKeyRef;


}

-(NSString*) rsaEncryptString:(NSString*) string
{
        SecKeyRef publicKey = [self getPublicKeyForEncryption];

        NSData* strData = [string dataUsingEncoding:NSUTF8StringEncoding];

         CFErrorRef err ;

         NSData * data = CFBridgingRelease(SecKeyCreateEncryptedData(publicKey, kSecKeyAlgorithmRSAEncryptionPKCS1, ( __bridge CFDataRef)strData, &err));
         NSString *base64EncodedString = [data base64EncodedStringWithOptions:0];
         return base64EncodedString;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM