Данные, подписанные на iOS - Цель C при проверке в Java всегда возвращают false - PullRequest
0 голосов
/ 03 февраля 2019

Код iOS:

//step 1

//start of key pair genration

NSString * PrivTagString = @"com.manish.rsa.privIdentifier";

NSString * PubTagString = @"com.manish.rsa.pubIdentifier";



 privateTag = [PrivTagString dataUsingEncoding:NSUTF8StringEncoding];

 publicTag = [PubTagString dataUsingEncoding:NSUTF8StringEncoding];



NSDictionary *privateAttributes = @{(NSString *)kSecAttrIsPermanent: @YES, (NSString *)kSecAttrApplicationTag: privateTag};

NSDictionary *publicAttributes = @{(NSString *)kSecAttrIsPermanent: @YES, (NSString *)kSecAttrApplicationTag: publicTag};



NSDictionary *pairAttributes = @{(NSString *)kSecAttrKeyType: (NSString *)kSecAttrKeyTypeRSA, (NSString *)kSecAttrKeySizeInBits: @2048, (NSString *)kSecPublicKeyAttrs: publicAttributes, (NSString *)kSecPrivateKeyAttrs: privateAttributes};



OSStatus osStatus = SecKeyGeneratePair((CFDictionaryRef)pairAttributes, &publicKeyRef, &privateKeyRef);

switch (osStatus) {

    case noErr:

        break;

    default:

        break;

}

//end of key pair key genration



//step2

//export ublic key for java server



NSLog(@"%@",[self getPublicKeyAsBase64ForJavaServer]);





//step3

//Create the SHA256 digest of the custom string with CC_SHA256

NSString *stringToSign = @"Manish";



NSMutableData *hash = [NSMutableData dataWithLength:(NSUInteger)CC_SHA256_DIGEST_LENGTH];

NSData *data = [stringToSign dataUsingEncoding:NSUTF8StringEncoding];

CC_SHA256(data.bytes, (CC_LONG)data.length, hash.mutableBytes);



//step4

// Sign the hash with the private key

size_t blockSize = SecKeyGetBlockSize(privateKeyRef);



NSUInteger hashDataLength = hash.length;

const unsigned char *hashData = (const unsigned char *)hash.bytes;



NSMutableData *result = [NSMutableData dataWithLength:blockSize];





uint8_t *signedHashBytes = malloc(blockSize * sizeof(uint8_t));

memset((void *) signedHashBytes, 0x0, blockSize);

size_t encryptedDataLength = blockSize;



OSStatus status = SecKeyRawSign(privateKeyRef, kSecPaddingPKCS1SHA256, hashData, hashDataLength, signedHashBytes, &encryptedDataLength);



NSData *signedHash = [NSData dataWithBytes:(const void *) signedHashBytes length:(NSUInteger) encryptedDataLength];



NSLog(@"%@",[signedHash base64EncodedStringWithOptions:0]);

Код Java

String message = new String("Manish".getBytes(),"UTF-8");
String sign = "UDhDZd5NWA0nVOyspxgiklAk4LIqY8eaM7f8RJSTdr058BIVTH99AVnfQ8Yz7zEQeKVWKF3BG0e+maaJpK3lfRLs5ohjs6pxBEIFODr6fkSQjQ5NEr4LHNh51Q7TY6RyOFvk9qasXcLuqLM+DjawSAN0/HjUq4GM6eNgQ4EYtrDa72HuRCiGKdIz/TdZSITQjT0bOfUVssR3869PmVjVX43TzPZv7j2/A+t8BT0lkURD+Z2v1DJeSdopjLESuQ6+DCRkwHPw63thymvR8tU3VUiQ4DfABTV3xB6gQp4MaTN0hGreOXHh9iiPQaEII7wa6vq7JS7l26gAzz8Yiu4AsA==";

String pub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2udbgzyYEm2pPIA23GwZbjy2osoN9+nirttWFQwXWAyz2Fr+D6b45Xzvqr03wByySosRMQSZLs5eDYXPpmK12wGNKtQu8RaaodVfJ7p86mQY0/TapLoUpMkU6cmjxZV3gcrv811uL13zRQpuixHFU8aIzKJ4DU5/XuU0TSM1Z3nUnRj9cdGswG8JW2jWfWHNJIMUsq9y7A8ti/wNbXQgjHWr0S9pFIuZHV0kP9UFa0SHHdjj3HpUz324DWpsYfMJsPCVDsbedK0ckDfHjmhLYi2xOgYb7k2AGW0tLqiOigaHYbRR4glm4ztlNr8QjDlDo+k5rnlhv8/ZC1Zy3XAU/wIDAQAB";
byte[] decodedPublicKey = Base64.getDecoder().decode(pub.getBytes("UTF-8"));
X509EncodedKeySpec publickeySpec = new X509EncodedKeySpec(decodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(publickeySpec);


final Signature instace = Signature.getInstance("SHA256withRSA");
instace.initVerify(publicKey);
instace.update(message.getBytes("UTF-8"));
boolean result =instace.verify(Base64.getDecoder().decode((sign.getBytes("UTF-8"))));
System.out.println(result);

Результат всегда будет ложным.Я испробовал множество других существующих решений, таких как: Подписание RSA SHA256 в iOS и проверка на Java и Данные, подписанные на iOS, невозможно проверить на Java Но не повезло.Пожалуйста, предоставьте ваш ценный вклад, что я пропустил?Я чувствую, что где-то есть проблема с кодировкой.

1 Ответ

0 голосов
/ 14 февраля 2019

Я обнаружил ошибку в своем коде, поскольку я сохранял ключи при создании их в цепочке для ключей, поэтому в первый раз, когда я использовал подписанный ключ и открытый ключ, он был правильно проверен в конце Java, но в следующий раз, когда я снова создавал ключ и идентификаторгде тот же самый и старый ключ все еще присутствовал в цепочке для ключей, так что это доставляло мне неприятности.Чтобы решить эту проблему, я просто удалил ключи из цепочки для ключей, прежде чем снова создавать их, и теперь он работает нормально;)

...