Dekrypcja tekstu zakodowanym kluczem

0

@Shalom:

Mimo, ostatniej pomocy, nadal nie ogarniam krypto na tyle zeby ogarnac prosty mechanizm.

kod javovy

	public static String decrypt(String cipherText, PrivateKey privateKey,
			String encryptedKey) throws Exception {

		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.PRIVATE_KEY, privateKey);
		byte[] decryptedKey = cipher.doFinal(Base64.getDecoder().decode(
				encryptedKey));

		// Convert bytes to AES SecretKey
		SecretKey originalKey = new SecretKeySpec(decryptedKey, 0,
				decryptedKey.length, "AES");

		Cipher aesCipher = Cipher.getInstance("AES");

		aesCipher.init(Cipher.DECRYPT_MODE, originalKey);

		byte[] bytes = Base64.getDecoder().decode(cipherText);

		return new String(aesCipher.doFinal(bytes), UTF_8);

	}
  1. dekodujemy z base64 encrypted key na byte[]
  2. kluczem dekodujemy byte[] za pomoca RSA/ECB/PKCS1Padding". Tutaj nie do konca wiem jak to ustawic w c#
  3. bierzemy zdekodowany klucz i go kodujemy za pomoca AES dzieki czemu powstaje oryginalny klucz.
  4. nastepnie za pomoca orignalnego klucza mozemy zrobic decrypt za pomoca AES na zakodowanym tekscie. zamienic byte[] na string za pomoca utf8

I troche sie zatrzymalem.

  1. podpunkt zrobilem, z drugim mam juz troszke problemy, w sensie nie jestem pewien czy dobrze zrobilem. 3) nie ogarniam bo nie mam Key ani IV do aes crypto i nie wiem skad je wziac (czy je w ogole potrzebuje) do 4) jeszcze nie doszedlem :D
        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);
            //var str = System.Text.Encoding.Default.GetString(decryptedKeyData);
            //var result = Convert.ToBase64String(decryptedKeyData);
            using (MemoryStream mStream = new MemoryStream(decryptedKeyData))
            using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
            {
                using (CryptoStream cryptoStream = new CryptoStream(mStream,
                    aesProvider.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) // nie mam skad wziac Key ani IV. Juz wiem ze robie cos zle :D
                {
                    cryptoStream.Read(decryptedKeyData , 0, decryptedKeyData .Length);
                }
                var plain = mStream.ToArray();
            }
            
            return result;
        }

troche stoje w miescu, wiec cokolwiek byloby bardzo pomocne zeby mnie popchac w jakims kierunku :)

1

https://docs.microsoft.com/pl-pl/dotnet/api/system.security.cryptography.aesmanaged?view=netframework-4.7.2
Edit:
The size of the IV property must be the same as the BlockSize property divided by 8. why

int keySize = 16; // 16, 24 or 32 
string keyString = // > keySize 
int IvLength = 16;
UTF8Encoding encoder;
AesManaged aes;

encoder = new UTF8Encoding();
aes = new AesManaged { Key = encoder.GetBytes(keyString).Take(keySize).ToArray() };
aes.BlockSize = IvLength * 8; // 128-bit block size AES

// buffer, key = aes.Key, IV = vector
byte[] bytesDecrypted
using (ICryptoTransform decryptor = aes.CreateDecryptor(key, IV))
{
bytesDecrypted = decryptor.TransformFinalBlock(buffer, 0, buffer.Length);
}
result = encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);
1

No to znów: bez danych do walidacji się niestety nie obejdzie :) Generalnie wygląda to tak:

  1. Bierzesz zaszfrowany klucz
  2. Dekodujesz go za pomocą klucza prywatnego RSA. Jeśli zrobiłeś to poprawnie to wyszedł ci klucz AESa więc będzie miał 128/192/256 bitów. To taka pierwsza asercja -> jeśli wyszło cokolwiek innego to coś jest nie tak. To co wychodzi to jest aes key. Daj jakąś asercje na to swoje decryptedKeyData i upewnij się że wyszło coś o sensownej długości.
  3. Jeśli nie jest podane inaczej to może jest to AES-ECB, więc żadne IV nie jest ci potrzebne. Ale dla spokoju możesz dać IV 16 bajtów \0, w najgorszym wypadku popsuje ci to pierwszy blok plaintextu (jeśli to jakieś CBC), ale reszta będzie ok. Niemniej często też IV jest po prostu pierwszym blokiem ciphertextu (bo nie musi wcale być tajne), więc gdyyb się okazało ze po ustawieniu IV na same 0 masz na początku 16 losowych bajtów ale plaintext wygląda na "cały" to znaczy ze IV jest zapewne pierwszym blokiem ciphertextu.
  4. Pomieszałeś strasznie bo próbujesz "deszyfrować klucz" zamiast twojego encryptedMessage :P
1

wiec w mailu jest napisany ze jest to AES 128 Bitowy

@Shalom jako znasz holenderski to przekleje. Jezeli potrzeba to moge przetlumaczyc

  1. We genereren een unieke symetrische sleutel (128 bits AES)
  2. We versleutelen de payload met deze sleutel. Dit levert de EncryptedPayload op.
  3. We halen de publieke sleutel op van het Foo certificaat
  4. We versleutelen de unieke sleutel (stap 1) met de publieke sleutel uit stap 3. (hiervoor gebruiken als Cipher RSA. In java (RSA/ECB/PKCS1Padding)). Dit zal een ‘EncryptedKey’ opleveren.

teraz kod wyglada tak


        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var encoder = new UTF8Encoding();
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);

            var aes = new AesManaged { Key = decryptedKeyData.Take(16).ToArray() };
            aes.BlockSize = 16 * 8; // 128-bit block size AES

            byte[] bytesDecrypted;
            var ecryptedMessageData = Convert.FromBase64String(encryptedMessage);
            using (ICryptoTransform decryptor = aes.CreateDecryptor())
            {
                bytesDecrypted = decryptor.TransformFinalBlock(ecryptedMessageData, 0, ecryptedMessageData.Length);
            }
            var result = encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);

            return result;
        }

bytesEncryptedKey ma 256 bajtow

natomiast decryptedKeyData ma 16 bajtow. Niestety nie wiem czy jest to poprawne czy nie, ale sadze ze tak. Skoro ma byc 128 bitowy to 16 * 8 = 128

ale przy bytesDecrypted = decryptor.TransformFinalBlock(ecryptedMessageData, 0, ecryptedMessageData.Length); dostaje

Padding is invalid and cannot be removed.

Jeszcze jedna rzecz z certyfikatu, biore tylko prywatny klucz. Moze to jest problemem?

 rsaCryptoServiceProvider = (RSACryptoServiceProvider)certificate.PrivateKey;

tylko ze jak daje publiczny to mam blad ze klucz nie istnieje

0

No opisali dokładnie to co napisałem wyżej :P

bytesEncryptedKey ma 256 bajtow

I dobrze bo masz tam 2048 bitów RSA :)

natomiast decryptedKeyData ma 16 bajtow

Póki co jest dobrze, bo gdyby źle sie zdekoowało coś to wyszłoby znowu jakieś 256 bajtów. Jak jest 16 to jest spoko!

Padding is invalid and cannot be removed.

Może to nie jest AES-CBC tylko AES-ECB po prostu? Certyfikatu ani tego RSA nie ruszaj, to jest ok. Ten AesManaged ma Mode -> https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.aesmanaged.mode?view=netframework-4.7.2 spróbuj dać tam ECB.

0

encryptedmessage

foVP0YwWMIDTg1YUzg2Vj/8AVFbu/XvAzWH1kaMp5nPO7YVD9T9haUIgSFvEWiVZK5k/Ny6jhJL+C+8wLC9kjl5NFmlfEQH5bGdu7MaAuBurEYa/AOt+erPqIUt45f85Bc+97jzw0DtVSOaUiK/x9h87EFOHSmwpi/s7753v9HSvFbn3nDhXV3MOrEKhW7nAn9ueroxlxf0jxpTZoP0HVm9AAdmWvuJeYJhdE14F68uMc+IAXekm+MAPoMNZCOsyTUOyYXIXfmnK/1rysNqjcDK41sAnGxierwoE8pNOQEAnKh5HpBI3W8AH+YNKR2xfLLtcgHmhunBDoEM/2YD2Li2Qv6OyjvUWn/7PNkp6shrMLf0SjqgCj2ia9gKVzZcPz5TH1xPjrBJBqGPJ9cSfDBBd9CqW4+D+owF1v6806AZUcVdfuzltSXLHOuLfbCGsUZZaaVJhPhP+QLAlC5v3XzgxxSVQ8OLUGhF3SxXrY0UICUJOunfm6vnqMAT36m8Ydsjc8qqV/Km1Fj5g+q4nJ3LLVwjyvlpBxOOhDi3W0y2SGh5l8JNtgKFuYKBVSUOeBwc3aX2r4jG+PzCObU6jvyiftc5Civ5Bl3NIwg30nyhk1035AaQEl4svCqCPiAz0+1xBtq7YeW4KwaMPjJHAwcgMY04Urm4ir2fiNpKy6Au1D/Giy4rYRF5/KoOv79GNdvMyL1PM7HhS6hqnc/YtXIggJkYh6STAzSlgVUb4C/X59wdaq736CQG0bm/0x56gSdNflDAXb4zsafFkN3daGTeY22xqPEOihLTYNdd4n2UDRKZdrn4dACEE8XskZsyK3I9fwbqj05COQJHRXfx9d9QNYL8g6BLsqpJGMT+zEtwOH18Yrzd7fGJ3uFFTa1GnhWhV00oCTClbLpJ1KI6FSGnC0iSFr/KwAQk1oCPKkrzDx4hwOsMxc/oQ52Kwjt5JP18SnSCWEmiu4ovQV95FUsMKzHaBjaKs109DrKWTHSgWLqFle/P3q6aa39PRggmbBLLcDQLLlri/6kBlHdFknnP1OIwNQhWgFAd0hgQK1FA7RAUak/PoOhaP1l1C0r8n0fTnU88rxWepXQJ47KEZQnm116c0S+O83iiBhRuM3jE0Dh6R3kpGAPrEk26/1IxF4tQi85gDRfdNTF1rUR/ijGZZXADwJxYgiIHhiyZIjKTcSuct/D7dQkxLZFtQ77xq7ZwRLY3BpiumoyDxXcOLREM4DsHkL/3xctgA81a9SjpVulal4SkzZqWL/8R0gKqIROpZuzA8bRxJizgl4lIrJ7HdNje+y4g79439acLjrGYkLkCZb7e1xOMS5rAuRLs4Fcdjc2rE1AzL5GEmZXfNjDddr6y5LWorojmBl28OP1Ft4YraeFd4vvh6VIOjgAE7xnuxBmyCXQ9+xV9Gr4pIk8tagSIU34orgDSwsbmVVdBCiz1i0SScVMwBtaEZadaevwh/vWqnZn8dSmoqvIdgsuaChwjPSgFbERcZ/+y5+c04Je1nSMXLa0G9T6g1hwtA214amkiwD4RuIg4kgA2eu9r22Hpc902WRiBl5ADCtWMDZJcmwQ6vNVyMcJMvuXH9/lsL548iSAdZrM5sd+aFGbc52FifFgKlYQdBti9DDUsi8FS79bR4nxLXuy37m9q0gdMcEm7XZRPzSksXiVhGm+lafw53muNCJwMLh7fwXB0IOqJ5zhfl6dYbSDOMisVa

encrypted key

ZOtFWxzwk19GFi2VFdUtoNLAgMY0TdbvqKXF8fekTJCqWf74GF32Kgw1lE481b9kW0ZbuARR7/Ofn3aAaF1U4FMXNu5CKt25vPPlBnzrpgdQlun5bEmVnwoZtpgx9ZN1bgEnkw/rGWx+TtYahxIBjSfemgufEZg7fHNswWM/eWAa/iA4Hv43dgNEiLk9RnNru9Iy6MEuoe+e4I2vnOin0HXTDfy4zEP7yxAgXNzvcIQm7kscNAMnGo++ww5VFYG73ydmLo0IB7NOtmDoJzDk6ReE03S6p1gf1quE/bfufzoxW9bVnLax8ZTIJfRu6NguOYtLjQUGTZrvNagj3JGizA==

zamienilem decryptedKeyData na base64 wiec bez problemu mozesz do byte[] zrobic :)

mzpxo8onsMBiIX7fcUhWfQ==
1

Tak jak pisałem wyżej -> to jest AES-ECB a nie CBC, więc musisz sprawdzić sobie jak zmienic mode na ECB i powinno pyknąć.

1

zapomnialem odpisac!

bylbym tym co moze ktos wejdzie tutaj i bedzie szukal rozwiazania i bedzie jak w tym rysunku WHERE ARE YOU czy tam cos tam. Wiec zignorowalem odpowiedz @Visual Code (wybacz ;P) i po nakierowaniu przez @Shalom finalnie wyglada to tak

        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var encoder = new UTF8Encoding();
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);
            var ecryptedMessageData = Convert.FromBase64String(encryptedMessage);

            string plaintext = string.Empty;

            using (RijndaelManaged rijAlg = new RijndaelManaged { Mode = CipherMode.ECB})
            {
                rijAlg.Key = decryptedKeyData;

                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                using (MemoryStream msDecrypt = new MemoryStream(ecryptedMessageData))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;
        }

czego mi brakowalo to Mode = CipherMode.ECB}

1 użytkowników online, w tym zalogowanych: 0, gości: 1