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

尼古拉斯·泰勒(Nicolas Tyler)

我试图在IOS中加密字符串,然后在C#中解密它。

我已经能够仅使用C#来加密和解密字符串,但是IOS方面似乎不正确。

在C#中,我使用它来解密字符串:

private static RSACryptoServiceProvider _rsa;
private const int PROVIDER_RSA_FULL = 1;
private const string CONTAINER_NAME = "KeyContainer";
private const string PROVIDER_NAME = "Microsoft Strong Cryptographic Provider";

private static void _AssignParameter()
{
    CspParameters cspParams;
    cspParams = new CspParameters(PROVIDER_RSA_FULL, PROVIDER_NAME, CONTAINER_NAME);
    cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
    CryptoKeyAccessRule rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow);
    cspParams.CryptoKeySecurity = new CryptoKeySecurity();
    cspParams.CryptoKeySecurity.SetAccessRule(rule);

    _rsa = new RSACryptoServiceProvider(cspParams);
    _rsa.PersistKeyInCsp = false;
}

private static void decrypt(byte[] data, byte[] PrivateKey)
{
    _AssignParameter();
    _rsa.ImportCspBlob(PrivateKey);
    _rsa.Decrypt(data, false);
}

上面的C#代码只是一个片段,而不是完整的代码。

看起来很简单,这就是我用于IOS的方式,

        //get nsdata from mod and exp
        NSString *mod = publicKeyObjects[0];
        NSData *pubKeyModData= [mod dataUsingEncoding:NSUTF8StringEncoding]; //172 bytes
        NSString *exp = publicKeyObjects[1];
        NSData *pubKeyExpData= [exp dataUsingEncoding:NSUTF8StringEncoding];

        //create nsdata key with mod and exp
        NSMutableArray *publicKeyArray = [[NSMutableArray alloc] init];
        [publicKeyArray addObject:pubKeyModData];
        [publicKeyArray addObject:pubKeyExpData];
        NSData *publicKeyData = [publicKeyArray berData];

        //add the key to the keychain and create a ref
        NSData* peerTag = [@"KeyContainer" dataUsingEncoding:NSUTF8StringEncoding];
        NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
        [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
        [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
        [publicKey setObject:peerTag forKey:(__bridge id)kSecAttrApplicationTag];
        SecItemDelete((__bridge CFDictionaryRef)publicKey);

        CFTypeRef persistKey = nil;

        // Add persistent version of the key to system keychain
        [publicKey setObject:publicKeyData forKey:(__bridge id)kSecValueData];
        [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef];
        OSStatus secStatus = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);
        if (persistKey != nil)
            CFRelease(persistKey);

        // Now fetch the SecKeyRef version of the key
        SecKeyRef keyRef = nil;

        [publicKey removeObjectForKey:(__bridge id)kSecValueData];
        [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
        [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
        secStatus = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey,(CFTypeRef *)&keyRef);


        NSData* stringData = [@"string to encrypt" dataUsingEncoding:NSUTF8StringEncoding];
        NSData* encryptedString = [self encrypt:passwordData usingKey:keyRef];


-(NSData *)encrypt:(NSData *)Bytes usingKey:(SecKeyRef)key
{
    size_t cipherBufferSize = SecKeyGetBlockSize(key); //returns 172
    uint8_t *cipherBuffer = NULL;
    cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
    memset((void *)cipherBuffer, 0x0, cipherBufferSize);
    OSStatus status = SecKeyEncrypt(key, kSecPaddingNone,
                                    (const uint8_t *)[Bytes bytes],
                                    [Bytes length], cipherBuffer,
                                    &cipherBufferSize);
    if (status == noErr)
    {
        NSData *encryptedBytes = [[NSData alloc]
                                   initWithBytes:(const void *)cipherBuffer
                                   length:cipherBufferSize];
        if (cipherBuffer)
        {
            free(cipherBuffer);
        }
        NSLog(@"Encrypted text (%d bytes): %@", [encryptedBytes length], [encryptedBytes description]);
        return encryptedBytes;
    }
    else
    {
        NSLog(@"encrypt:usingKey: Error: %d", (int)status);
        return nil;
    }
}

因此,一旦我尝试解密C#代码上的数据,我就会得到:

The data to be decrypted exceeds the maximum for this modulus of 128 bytes.

我已经用谷歌搜索了这个错误,看到它与keysize有关,但是我用IOS导入模数后的keysize是172个字节。

但是我只是用导出导出公钥 _rsa.ToXmlString(false);

编辑

我想我已解决了自己的错误,

    //get nsdata from mod and exp
    NSString *mod = publicKeyObjects[0];
    NSData *pubKeyModData= [mod dataUsingEncoding:NSUTF8StringEncoding];
    NSString *exp = publicKeyObjects[1];
    NSData *pubKeyExpData= [exp dataUsingEncoding:NSUTF8StringEncoding];

这是直接使用utf8转换base64字符串,它应该使用:

NSData *pubKeyModData = [[NSData alloc] initWithBase64EncodedString:mod options:0];
NSData *pubKeyExpData = [[NSData alloc] initWithBase64EncodedString:exp options:0];

现在我得到另一个错误 Bad Data

有人可以在这里指出正确的方向吗?对于所有代码,我也表示歉意。我只是不知道问题出在哪里。

尼古拉斯·泰勒(Nicolas Tyler)

回答了我自己的问题,

//get nsdata from mod and exp
NSString *mod = publicKeyObjects[0];
NSData *pubKeyModData= [mod dataUsingEncoding:NSUTF8StringEncoding];
NSString *exp = publicKeyObjects[1];
NSData *pubKeyExpData= [exp dataUsingEncoding:NSUTF8StringEncoding];

变成这样的:

//get nsdata from mod and exp
NSString *mod = publicKeyObjects[0];
NSData *pubKeyModData = [[NSData alloc] initWithBase64EncodedString:mod options:0];
NSString *exp = publicKeyObjects[1];
NSData *pubKeyExpData = [[NSData alloc] initWithBase64EncodedString:exp options:0];

那这个

OSStatus status = SecKeyEncrypt(key, kSecPaddingNone,
                                (const uint8_t *)[Bytes bytes],
                                [Bytes length], cipherBuffer,
                                &cipherBufferSize);

成为:

OSStatus status = SecKeyEncrypt(key, kSecPaddingPKCS1,
                                (const uint8_t *)[Bytes bytes],
                                [Bytes length], cipherBuffer,
                                &cipherBufferSize);

简单的配置修复。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

iOS:使用公钥(具有模数和指数)进行RSA加密

来自分类Dev

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

来自分类Dev

如果只有公钥,如何使用RSA / OAEP进行加密/解密

来自分类Dev

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

来自分类Dev

Qt:使用私钥/公钥进行数据解密

来自分类Dev

在C#中使用MachineKey进行加密和解密

来自分类Dev

使用C#中的证书进行加密和解密

来自分类Dev

使用C#进行SQL Server加密/解密

来自分类Dev

Laravel使用C#进行加密和解密

来自分类Dev

如何在Linux中使用xml公钥进行加密

来自分类Dev

使用C ++进行加密和解密

来自分类Dev

使用C#对其进行加密,然后使用Android对其进行解密(AES | IllegalBlockSizeException)

来自分类Dev

在C#中使用RSA公钥和私钥加密数据

来自分类Dev

使用JS和PHP进行RSA加密和解密

来自分类Dev

使用RSA和AES进行加密/解密;标准?

来自分类Dev

使用C#进行AES解密

来自分类Dev

使用TSS.NET在TPM2上进行公钥加密

来自分类Dev

如何使用phpseclib进行加密和使用AES算法使用Java进行解密

来自分类Dev

使用ZipArchive类进行加密/解密

来自分类Dev

使用AES算法进行加密和解密

来自分类Dev

使用Java进行AES加密和解密

来自分类Dev

使用SIP TLS进行加密/解密

来自分类Dev

使用Spring Security进行AES加密/解密

来自分类Dev

使用LuaJit进行FFI加密/解密

来自分类Dev

使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

来自分类Dev

快速使用公钥加密

来自分类Dev

RNCryptor:使用rncrypt(cli)进行加密,然后在iOS中使用RNDecryptor进行解密

来自分类Dev

使用node-forge进行加密,并使用python和RSA-OAEP进行解密

Related 相关文章

  1. 1

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

  2. 2

    iOS:使用公钥(具有模数和指数)进行RSA加密

  3. 3

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

  4. 4

    如果只有公钥,如何使用RSA / OAEP进行加密/解密

  5. 5

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

  6. 6

    Qt:使用私钥/公钥进行数据解密

  7. 7

    在C#中使用MachineKey进行加密和解密

  8. 8

    使用C#中的证书进行加密和解密

  9. 9

    使用C#进行SQL Server加密/解密

  10. 10

    Laravel使用C#进行加密和解密

  11. 11

    如何在Linux中使用xml公钥进行加密

  12. 12

    使用C ++进行加密和解密

  13. 13

    使用C#对其进行加密,然后使用Android对其进行解密(AES | IllegalBlockSizeException)

  14. 14

    在C#中使用RSA公钥和私钥加密数据

  15. 15

    使用JS和PHP进行RSA加密和解密

  16. 16

    使用RSA和AES进行加密/解密;标准?

  17. 17

    使用C#进行AES解密

  18. 18

    使用TSS.NET在TPM2上进行公钥加密

  19. 19

    如何使用phpseclib进行加密和使用AES算法使用Java进行解密

  20. 20

    使用ZipArchive类进行加密/解密

  21. 21

    使用AES算法进行加密和解密

  22. 22

    使用Java进行AES加密和解密

  23. 23

    使用SIP TLS进行加密/解密

  24. 24

    使用Spring Security进行AES加密/解密

  25. 25

    使用LuaJit进行FFI加密/解密

  26. 26

    使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

  27. 27

    快速使用公钥加密

  28. 28

    RNCryptor:使用rncrypt(cli)进行加密,然后在iOS中使用RNDecryptor进行解密

  29. 29

    使用node-forge进行加密,并使用python和RSA-OAEP进行解密

热门标签

归档