PKCS#11: шифрование нескольких незашифрованных текстов

Я хочу зашифровать большое количество открытого текста с помощью устройств PKCS#11 и SafeNet HSM. Шифрование каждого открытого текста по отдельности займет много времени.

Итак, мне пришло в голову, есть ли в PKCS#11 какие-либо методы, которые могут зашифровать несколько данных одновременно?

Я нашел приведенный ниже образец для шифрования данных, состоящих из нескольких частей, в руководстве по программированию SafeNet C, в котором используются API-интерфейсы PKCS#11.

      /* read, encrypt, digest and write the cipher text in chunks
*/ totbw = 0;
for ( ;; ) {
    br = fread(buffer, 1, sizeof(buffer), ifp);
    if ( br == 0 )
        break;
    
    /* digest */

    /* encrypt */
    curLen = sizeof(encbuffer);
    rv = C_EncryptUpdate(hrSession, buffer, (CK_SIZE)br, encbuffer, &curLen);
    CHECK_RV(FN "C_EncryptUpdate", rv);
    if (rv) return 1;
    
    /* write cipher text */
    br = fwrite(encbuffer, 1, (int)curLen, ofp);
    totbw += br;
}

В этом руководстве упоминается:

Для шифрования мы используем C_EncryptUpdate, который продолжает операцию множественного шифрования, обрабатывая другую часть данных.

Я хочу знать, можно ли использовать этот метод для одновременного шифрования нескольких открытых текстов или он будет рассматривать все элементы буфера как блоки одних и тех же входных данных?

Я ищу решение, которое может шифровать несколько открытых текстов, но рассматривать их как отдельный элемент (а не как блоки одного большого элемента).

2 ответа

Он будет рассматривать все данные как блоки одного входа. Он предназначен для шифрования данных в виде потока. Поэтому, если вы думаете, что можете использовать его для распараллеливания процесса шифрования, вы ошибаетесь.

Кстати, какой механизм вы используете для шифрования? Не говорите мне, что вы просто используете асимметричный алгоритм (например, RSA) напрямую. Если вы это сделаете, то ваш процесс шифрования будет очень медленным.

У меня есть для вас решение, состоящее из двух частей:

    1. зашифровать в вашем оборудовании. это должно разрешить нити в JAVA.
    1. Используйте Salt Concept от HSM только один раз в своей программе шифрования.

------- на вашем оборудовании (# CP´s) Запустите программу для шифрования AES256 ----- но используя HSM для получения токена или случайного числа, это будет наша СОЛЬ.

          import java.io.Serializable;
    import java.nio.charset.StandardCharsets;
    import java.security.spec.KeySpec;
    import java.util.Base64;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.SecretKeySpec;

    public class Encrypt implements Serializable {

        private static final String secretKeyAES = "My_Long_bytes_to_cipher";
        private static final String saltAES = "My_Salt_only_one_time_for_20M_ByHMS_Random";

        public Encrypt() {
}

public String getAES(String data) {
    try {
        byte[] iv = new byte[16];
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec keySpec = new PBEKeySpec(secretKeyAES.toCharArray(), saltAES.getBytes(), 65536, 256);
        SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
        SecretKeySpec secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes("UTF-8")));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public String getAESDecrypt(String data) {
    byte[] iv = new byte[16];
    try {
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec keySpec = new PBEKeySpec(secretKeyAES.toCharArray(), saltAES.getBytes(), 65536, 256);
        SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
        SecretKeySpec secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
        return new String(cipher.doFinal(Base64.getDecoder().decode(data)));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
    }

----- этот ответ разрешает петиции HSM, но теперь вы должны разрешить белые петиции в JAVA.

большая часть обработки будет выполняться на стороне процессора

Другие вопросы по тегам