iOS에서 타원 곡선 알고리즘을 사용하여 데이터에 서명하고 서명을 확인하려고합니다. 키를 만드는 것만으로도 충분하지만 데이터에 서명하려고하면 매우 일반적인 일반 오류 -1
이 반환됩니다.iOS의 kSecAttrKeyTypeEC 키로 데이터 서명
publicKeyRef = NULL;
privateKeyRef = NULL;
NSDictionary * privateKeyAttr = @{(id)kSecAttrIsPermanent : @1,
(id)kSecAttrApplicationTag : privateTag};
NSDictionary * publicKeyAttr = @{(id)kSecAttrIsPermanent : @1,
(id)kSecAttrApplicationTag : privateTag};
NSDictionary * keyPairAttr = @{(id)kSecAttrKeySizeInBits : @(keySize),
(id)kSecAttrKeyType : (id)kSecAttrKeyTypeEC,
(id)kSecPrivateKeyAttrs : privateKeyAttr,
(id)kSecPublicKeyAttrs : publicKeyAttr};
OSStatus status = SecKeyGeneratePair((CFDictionaryRef)keyPairAttr, &publicKeyRef, &privateKeyRef);
이 지금까지, 그래서 좋은 상태 0
를 반환 다음과 같이
키가 생성됩니다. 실제 서명은 다음과 같이 발생합니다
- (NSData *) signData:(NSData *)dataToSign withPrivateKey:(SecKeyRef)privateKey {
NSData * digestToSign = [self sha1DigestForData:dataToSign];
size_t signedHashBytesSize = SecKeyGetBlockSize(privateKey);
uint8_t * signedHashBytes = malloc(signedHashBytesSize * sizeof(uint8_t));
memset((void *)signedHashBytes, 0x0, signedHashBytesSize);
OSStatus signErr = SecKeyRawSign(privateKey,
kSecPaddingPKCS1,
digestToSign.bytes,
digestToSign.length,
(uint8_t *)signedHashBytes,
&signedHashBytesSize);
NSLog(@"Status: %d", signErr);
NSData * signedHash = [NSData dataWithBytes:(const void *)signedHashBytes length:(NSUInteger)signedHashBytesSize];
if (signedHashBytes) free(signedHashBytes);
return (signErr == noErr) ? signedHash : nil;
}
- (NSData *)sha1DigestForData:(NSData *)data {
NSMutableData *result = [[NSMutableData alloc] initWithLength:CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (CC_LONG) data.length, result.mutableBytes);
return result;
}
호출 SecKeyRawSign()
로 돌아 -1
.
이
는서명 데이터에 대한 EC의 키를 사용하는 올바른 방법이 무엇 https://forums.developer.apple.com/message/95740#95740 각색? 여기에 RSA 키를위한 작업 솔루션이 있습니다 : Signing and Verifying on iOS using RSA하지만 EC 키에 적용 할 수 없었습니다.