PowerShell ConvertFrom-SecureString в Java? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь повторно внедрить ConvertFrom-SecureString PowerShell в Java. Документация там немного скудна. Все это говорит "AES". Испытание различных примеров шифрования AES на стороне Java не дало мне дальнейшего развития.

Может быть, у меня есть несколько указателей для меня?


Приложение 1

Указателипредоставленные комментарии выглядят полезными. Спасибо!

Этот скрипт PowerShell показывает, что я пытаюсь «перенести» на Java, по крайней мере, в часть шифрования (с ключом, состоящим всего из 32 случайных байтовых значений):

$key = 202,144,73,88,228,1,7,104,95,212,137,87,125,201,80,75,53,18,39,108,60,218,212,151,239,241,34,117,106,184,212,179

$secret = "banana"
Write-Output "secret   : $($secret)"

# encrypt
$secretSecured = ConvertTo-SecureString $secret -AsPlainText -Force
$encrypted = ConvertFrom-SecureString -secureString $secretSecured -key $key
Write-Output "encrypted: $($encrypted)"

# decrypt
$secure = $encrypted | ConvertTo-SecureString -key $key
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
$decrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
Write-Output "decrypted: $($decrypted)"

Выполняетсяэто дает следующее:

secret   : banana
encrypted: 76492d1116743f0423413b16050a5345MgB8AEkAdQBpAEIANQBaAHQAeQAvAE0AOQBpAE0ATwByAEEAcgBlAC8AOQB2AGcAPQA9AHwANwBkAGIANwBiADgAYgBhADIAZgA4ADAAZQBlADEAZQA0ADgAYQA1ADUAYgBiADYAZgAyADQAMQA5ADkAMwA5AA==
decrypted: banana

Приложение 2

Вот теперь первый черновой порт на Java (также в этом репозитории Github ):

import org.junit.Before;
import org.junit.Test;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

public class EncryptionTest{

    SecretKeySpec key;
    IvParameterSpec ivSpec;
    Cipher cipher;

    @Before
    public void init() throws Exception{
        int[] ints = {202,144,73,88,228,1,7,104,95,212,137,87,125,201,80,75,53,18,39,108,60,218,212,151,239,241,34,117,106,184,212,179};
        byte[] bytes = new byte[ints.length];
        for (int i=0; i<ints.length; i++){
            bytes[i] = (byte)ints[i];
        }
        key = new SecretKeySpec(bytes, "AES");

        byte[] iv = new byte[16];
        SecureRandom random = new SecureRandom();
        random.nextBytes(iv);
        ivSpec = new IvParameterSpec(iv);

        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    }

    @Test
    public void testIt() throws Exception{
        String secret = "banana";

        System.out.println("secret   : "+secret);

        byte[] encrypted = encrypt(secret);
        System.out.println("encrypted: "+Base64.getEncoder().encodeToString(encrypted));

        String decrypted = decrypt(encrypted);
        System.out.println("decrypted: "+decrypted);
    }

    byte[] encrypt(String secret) throws Exception{
        cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        return cipher.doFinal(secret.getBytes());
    }

    String decrypt(byte[] encrypted) throws Exception{
        cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
        return new String(cipher.doFinal(encrypted));
    }
}

Запуск его (в JUnit) дает следующее:

secret   : banana
encrypted: P51DH0d0FRvUoetaujEyjA==
decrypted: banana

Интересно, почему зашифрованная строка здесь имеет длину всего 24 символа, а PowerShell - 192 символа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...