Java equivalent encryption code in .NET

Anonymous
2021-09-15T10:06:03.86+00:00

Could you write equivalent code on C#?
I need encrypt data with my generate key. And I need encrypt key with private pem. Then send to service. Service has public cert. But service cannot encrypt my data.
Maybe my code wrong. Help me please

I need generate key:

Java:

final KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
final SecretKey secretKey = keyGenerator.generateKey() ;
final byte[] aesKey = secretKey.getEncoded() ;

My variant in C#:

static byte[] Key(int keyByteSize = 16)
        {
            byte[] randomArray = new byte[keyByteSize];
            using (var rng = RandomNumberGenerator.Create())
            {
                rng.GetBytes(randomArray);
            }

            return randomArray;
        }

Then encrypt data

Java:

final SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey, "AES"); 
final Cipher encryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
final byte[] cleartext = unencryptedString.getBytes("UTF-8"); 
final byte[] ciphertext = encryptCipher.doFinal(cleartext); 
final String securePayload = Base64.getEncoder().encodeToString(ciphertext);

My variant in C#:

public static string SecurePaylod(string stringText, byte[] aesKey)
        {
            var input = Encoding.UTF8.GetBytes(stringText);
            var aesAlg = new AesManaged
            {
                KeySize = 128,
                Key = aesKey, // my aesKey
                BlockSize = 128,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.Zeros,
                IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
            };
            var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            byte[] paylodByteArray = encryptor.TransformFinalBlock(input, 0, input.Length);
            var securePaylod = Convert.ToBase64String(paylodByteArray); // securePaylod

            return securePaylod;
        }

And encrypt my generate key:
Java:

final org.bouncycastle.openssl.PEMReader pemReader = new org.bouncycastle.openssl.PEMReader(new StringReader(privateKeyPEM));
final KeyPair keyPair = (KeyPair) pemReader.readObject();
pemReader.close() ;
final PrivateKey privateKey = keyPair.getPrivate() ;
final Cipher clientPrivateCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") ;
clientPrivateCipher.init(Cipher.ENCRYPT_MODE, privateKey) ;    
final byte[] aesKeyEncrypted = clientPrivateCipher.doFinal(aesKey) ;    
final String secureKey = Base64.getEncoder().encodeToString(aesKeyEncrypted) ;

C#:

public static string SecureKey(byte[] aesKey)
{
RSACryptoServiceProvider cryptoServiceProvider = new RSACryptoServiceProvider();

    using (StreamReader sr = new StreamReader("path/to/private.pem"))
    {
        PemReader pr = new PemReader(sr);
        AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
        var rsa = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);

        cryptoServiceProvider.ImportParameters(rsa);
    }


    byte[] encryptedBytes = cryptoServiceProvider.Encrypt(aesKey, false);
    var secureKey = Convert.ToBase64String(encryptedBytes); // secureKey

    return secureKey;
}
Developer technologies C#
{count} votes

Accepted answer
  1. Anonymous
    2021-10-15T08:17:54.797+00:00

    I have a solution:

    using System;
    using System.Text;
    using Org.BouncyCastle.OpenSsl;
    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.Crypto.Engines;
    using Org.BouncyCastle.Crypto.Encodings;
    using System.Security.Cryptography;
    using System.IO;
    
    public static string CreateSecureLoad(string unencryptedPayload, ref byte[] generatedAesKey)
            {
                // This method generates and returns a secure payload 
    ​
                RijndaelManaged cryptoAlgo = new RijndaelManaged
                {
                    Padding = PaddingMode.PKCS7,
                    Mode = CipherMode.ECB,
                    KeySize = 128,
                    BlockSize = 128
                };
    ​
                generatedAesKey = cryptoAlgo.Key;
                var clearTextArray = Encoding.UTF8.GetBytes(unencryptedPayload);
                var encryptor = cryptoAlgo.CreateEncryptor();
    ​
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(
                        msEncrypt,
                        encryptor,
                        CryptoStreamMode.Write))
                    {
                        csEncrypt.Write(clearTextArray);
                        csEncrypt.FlushFinalBlock();
                        var cipher = msEncrypt.ToArray();
                        return Convert.ToBase64String(cipher);
                    }
                }
            }
    
    public static string CreateSecureKey(byte[] aesKey, string privateKeyPEM)
            {
                // This method generates and returns a secure key
                // Accepts the string contents of the private key PEM file as input
    ​
                var encryptEngine = new Pkcs1Encoding(new RsaEngine());
    ​
                using (var textReader = new StringReader(privateKeyPEM))
                {
                    var pemReader = new PemReader(textReader);
                    var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
                    encryptEngine.Init(true, keyPair.Private);
                }
    ​
                var encrypted = Convert.ToBase64String(
                    encryptEngine.ProcessBlock(
                        aesKey,
                        0,
                        aesKey.Length));
                return encrypted;
            }
    
    static void Main(string[] args)
            {
                String payload = "some json";
    ​
                byte[] generatedAesKey = new byte[16];
                var privateKeyPEM = File.ReadAllText("privatekey.pem");
    ​
                var securePayload = CreateSecureLoad(payload, ref generatedAesKey);
                var secureKey = CreateSecureKey(generatedAesKey, privateKeyPEM);
    ​
                // Return encrypted key
                Console.WriteLine("secureKey: " + secureKey);
    ​
                // Return encrypted payload
                Console.WriteLine("securePayload: " + securePayload);
    ​
                Console.ReadLine();
    ​
            }
        }
    
    0 comments No comments

1 additional answer

Sort by: Most helpful
  1. Jack J Jun 25,296 Reputation points
    2021-09-20T03:20:42.84+00:00

    @Anonymous , based on your new description, your encryption belongs to asymmetric encryption. .NET provides the RSA class for asymmetric encryption.

    First, you could use RSA.Create Method and RSA.ExportRSAPrivateKey Method to generate the key.

    Code:

    RSA rsa = RSA.Create(123);    
     byte [] privatekey=rsa.ExportRSAPrivateKey();  
    byte [] publickey=rsa.ExportRSAPublicKey();  
       
    

    Second, you could use RSA.EncryptValue Method to encrypt the input data using the public key.

    Finally, you could refer to the code example to encrypt your generate key.

    Asymmetric encryption


    If the response is helpful, please click "Accept Answer" and upvote it.

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.