使用Objective C在iOS中使用公钥加密或签名字符串

先生

我有一个私钥。以“ ---开始私钥...”开头的文本文件

我想使用该密钥来加密NSString。由于它是私钥,因此最好将其签名为NSString。

没有任何外部框架就能做到吗?

结果应该等同于php openssl_sign函数。

先生

您无需外部资源或组件即可轻松解决此问题。

我发现了方法,并希望与他人分享,以便为他人提供帮助。

  1. 您需要加载密钥文件SecKeyRef并同时保护maxPlainLen
    NSString * resourcePath = [[[NSBundle mainBundle] pathForResource:privateKeyResourceName ofType:@“ p12”]]; 
    NSData * p12Data = [NSData dataWithContentsOfFile:resourcePath]; 

    NSMutableDictionary *选项= [[NSMutableDictionary分配] init];

    SecKeyRef privateKeyRef = NULL; 

    //更改为您在此处使用的实际密码
    [选项setObject:@“ _ YOURPASSWORDHERE__” forKey:(__ bridge id)kSecImportExportPassphrase]; 

    CFArrayRef项目= CFArrayCreate(NULL,0,0,NULL); 

    OSStatus securityError = SecPKCS12Import(((__ bridge CFDataRef)p12Data,(__bridge 
                                             CFDictionaryRef)options,&items); 

    如果(securityError == noErr && CFArrayGetCount(items)> 0){
        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items,0);
        SecIdentityRef identityApp = 
        (SecIdentityRef)CFDictionaryGetValue(identityDict,
                                             kSecImportItemIdentity); 

        securityError = SecIdentityCopyPrivateKey(identityApp,&privateKeyRef); 
        如果(securityError!= noErr){ 
            privateKeyRef = NULL; 
        } 
    } 
    CFRelease(项目); 

    privateKey = privateKeyRef; 
    maxPlainLen = SecKeyGetBlockSize(privateKey)-12;
  1. 您可以将带有类别方法的NSString转换为SHA1
    -(NSData *)toSha1AsData { 
        // PHP使用ASCII编码,而不是UTF 
        const char * s = [self cStringUsingEncoding:NSASCIIStringEncoding]; 
        NSData * keyData = [NSData dataWithBytes:s length:strlen(s)]; 

        //这是目标
        uint8_t摘要[CC_SHA1_DIGEST_LENGTH] = {0}; 
        //此函数对哈希数据
        CC_SHA1(keyData.bytes,keyData.length,digest)进行无密钥SHA1哈希

        //现在转换为NSData结构以使其再次可用
        NSData * out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]

        返回;
    }
  1. 现在,您可以使用此方法对SHA1进行签名

(NSData *)signSha1Data:(NSData *)data { size_t plainLen = [data length]; if (plainLen > maxPlainLen) { NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen); return nil; } void *plain = malloc(plainLen); [data getBytes:plain length:plainLen]; size_t cipherLen = 128; // currently RSA key length is set to 128 bytes void *cipher = malloc(cipherLen); OSStatus returnCode = SecKeyRawSign(privateKey, kSecPaddingPKCS1SHA1, plain, plainLen, cipher, &cipherLen); NSData *result = nil; if (returnCode != 0) { NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode); } else { result = [NSData dataWithBytes:cipher length:cipherLen]; } free(plain); free(cipher); return result; }

它运行良好,并且没有任何外部库。无需编译一些怪异的openssl东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在iOS中使用RSA公钥加密和解密字符串(纯文本)

无法在量角器中使用公钥加密字符串

使用给定的RSA公钥OpenSSL加密字符串

如何使用 python Openssl 公钥加密字符串?

Nodejs使用公钥字符串构造公钥

Java-使用现有的公钥文件加密字符串

Android Java-使用RSA公钥.PEM加密字符串

在Android中使用公钥加密

我有一个RSA公钥指数和模数。如何使用Python加密字符串?

使用PEM PrivateKey签名字符串

使用字符串生成公钥和私钥

如何使用公钥字符串创建OpenSSL :: PKey?

使用字符串中的公钥验证JWT

使用PHP生成公钥/私钥对并将公钥导出为.der编码的字符串

使用nodeJS和Objective-C的非对称公钥/私钥加密RSA

如何使用BouncyCastle C#将RSA公钥转换为字符串

如何在C#RSA中使用私钥加密和使用公钥解密

使用IOS进行公钥加密和使用C#进行解密

如何在Ruby中使用PKI(公钥/私钥)加密?

如何在C#中使用公钥加密密码并在私钥中解密私钥

使用公钥验证签名

使用DER格式的RSA公钥文件的iOS加密

使用NSUserDefaults时格式字符串未使用Objective-C iOS 10数据参数

使用JavaScript使用HmacSHA256正确签名字符串

iOS中使用Objective C的UIApplicationShortcutWidget的示例

在长字符串中使用UItextview / NSstring占位符的Objective C

在C ++中使用OpenSSL使用AES128加密字符串时出错

C#BouncyCastle-使用公钥/私钥进行RSA加密

如何使用私钥用rsa-sha256签名字符串?