Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以使用从iOS生成的公钥,在c#代码中对数据进行加密,并再次在iOS中对加密数据(使用私钥)进行解密?_C#_Swift_Encryption - Fatal编程技术网

我是否可以使用从iOS生成的公钥,在c#代码中对数据进行加密,并再次在iOS中对加密数据(使用私钥)进行解密?

我是否可以使用从iOS生成的公钥,在c#代码中对数据进行加密,并再次在iOS中对加密数据(使用私钥)进行解密?,c#,swift,encryption,C#,Swift,Encryption,我已经在iOS中生成了密钥对,当我解密使用c#code中的公钥加密的数据时,我收到以下错误 “Error Domain=NSOSStatusErrorDomain Code=-50”:符号-输入缓冲区错误大小(144字节)“UserInfo={NSDescription=:符号-输入缓冲区错误大小(144字节)}” 我使用的密钥大小为1024,使用的是rsaEncryptionPKCS1加密 iOS代码--- ** ---------------c#代码 我想以标准格式从iOS导出公钥,可以在c

我已经在iOS中生成了密钥对,当我解密使用c#code中的公钥加密的数据时,我收到以下错误

“Error Domain=NSOSStatusErrorDomain Code=-50”:符号-输入缓冲区错误大小(144字节)“UserInfo={NSDescription=:符号-输入缓冲区错误大小(144字节)}”

我使用的密钥大小为1024,使用的是rsaEncryptionPKCS1加密

iOS代码---

**

---------------c#代码


我想以标准格式从iOS导出公钥,可以在c#中提取,无需使用任何Nuget包……非常感谢您的帮助



我发现的一个解决方案是在C#中使用bouncy castle Nuget包导入RSA公钥,而不是在C#中加密数据



问你2小时前问的问题有什么意义?如果需要添加任何内容,请修改格式,您可以随时编辑您的问题。但是,使用公用iOS公钥的每个人都可以解密数据。。。既然它是公开的而不是为什么要加密,你应该使用Diffie–Hellman密钥交换iOS
解密
代码在哪里?谢谢ziatsman…我添加了解密代码,我发现的一个解决方案是使用C#中的bouncy castle Nuget包导入RSA公钥,而不是在C#中加密数据…但我想导出公钥iOS标准格式的密钥,无需使用任何Nuget软件包即可在c#中提取
private func createSecureKeyPair(_ keyTag: String, _ keyType :KeyType = .publicKey) -> Data? {
        // private key parameters
        let privateKeyParams: [String: AnyObject] = [
            kSecAttrIsPermanent as String: true as AnyObject,
            kSecAttrCanDecrypt as String: true as AnyObject,
            kSecAttrApplicationTag as String: keyTag as AnyObject,
        ]
        // private key parameters
        let publicKeyParams: [String: AnyObject] = [
            kSecAttrApplicationTag as String: keyTag as AnyObject,
            kSecAttrIsPermanent as String: true as AnyObject
        ]        
        // global parameters for our key generation
        let parameters: [String: AnyObject] = [
            kSecAttrKeyType as String:          kSecAttrKeyTypeRSA as AnyObject,
            kSecAttrKeySizeInBits as String:    1024 as AnyObject,
            kSecPublicKeyAttrs as String:       publicKeyParams as AnyObject,
            kSecPrivateKeyAttrs as String:      privateKeyParams as AnyObject,
        ]
        
        var pubKey, privKey: SecKey?
        let status = SecKeyGeneratePair(parameters as CFDictionary, &pubKey, &privKey)
        if status == errSecSuccess {
            print("Successfully generated keypair!\nPrivate key: \(String(describing: privKey))\nPublic key: \(String(describing: pubKey))")
            return self.getKeyData(keyTag,keyType)
        } else {
            print("Error generating keypair: \(status)")
            return nil
        }
    }

func encryptData(messageData: Data, publicKeySec: SecKey) -> Data? {     
        guard let encryptData = SecKeyCreateEncryptedData(
            publicKeySec,
            SecKeyAlgorithm.rsaEncryptionPKCS1,
            messageData as CFData,
            nil) else {
                print("Encryption Error")
                return nil
            }
        print(encryptData)
        return encryptData as Data
    }

func decryptData(messageData : Data, privateKeySec: SecKey) -> Data? {
        guard let decryptData = SecKeyCreateDecryptedData(
            privateKeySec,
            SecKeyAlgorithm.rsaEncryptionPKCS1,
            messageData as CFData,
            nil) else {
                print("Decryption Error")
                return nil
        }
        return decryptData as Data
    }


public static string RSAEncrypt(string plainData, string publicKeyXml)
        {
            using (RSA rsa = RSA.Create())
            {
                try
                {
                    rsa.KeySize = 1024;
                    RSAParameters parameter = FromXmlString(rsa, publicKeyXml);
                    rsa.ImportParameters(parameter);
                    byte[] encryptedBytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plainData), RSAEncryptionPadding.Pkcs1);
                    return Convert.ToBase64String(encryptedBytes);
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
        }
public static string RSAEncryptiOS(string plainData, string publicKeyiOS)
        {
            try
            {
                byte[] publicKeyBytes = Convert.FromBase64String(publicKeyiOS);

                var stream = new MemoryStream(publicKeyBytes);
                Asn1Object asn1Object = Asn1Object.FromStream(stream);
                Asn1Encodable asn1Sequence = asn1Object;

                AlgorithmIdentifier algorithmIdentifier = new
                AlgorithmIdentifier(PkcsObjectIdentifiers.IdRsaesOaep);

                SubjectPublicKeyInfo subjectPublicKeyInfo = new
                SubjectPublicKeyInfo(algorithmIdentifier, asn1Sequence);

                AsymmetricKeyParameter asymmetricKeyParameter2 =
                PublicKeyFactory.CreateKey(subjectPublicKeyInfo);

                RsaKeyParameters rsaKeyParameters =
                (RsaKeyParameters)asymmetricKeyParameter2;
                RSAParameters rsaParameters = new RSAParameters();
                rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
                rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();

                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportParameters(rsaParameters);
                //string test = "Hello World 2020";
                byte[] encbyte = rsa.Encrypt(Encoding.UTF8.GetBytes(plainData), RSAEncryptionPadding.Pkcs1);
                return Convert.ToBase64String(encbyte);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            
        }
***