Может ли криптосистема подсистемы шифровать и дешифровать отрицательные большие целые числа?

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

2 ответа

Решение

Нет, вы не можете использовать отрицательные числа, так как все вычисляется по модулю n.

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

Для этого вы можете использовать new BigInteger(1, plaintext) что всегда приведет к положительному числу. Первый параметр - это знак.

Вам может понадобиться кодирование для конкретных структур, например, с нулевыми битовыми значениями для старших значащих битов (сообщение-> кодировать-> преобразовать в число -> шифрование Paillier -> кодировать зашифрованный текст и декодировать зашифрованный текст -> дешифрование Paillier -> декодировать -> сообщение).

См. I2OSP и OS2IP для примера того, как кодировать / декодировать данные в числа.

Криптосистема Пайе определяется по модулю n для открытого текста и n^2 для зашифрованного текста. Таким образом, если вы даже зашифруете отрицательное число, оно будет иметь положительный эквивалент по модулю n. Это можно доказать на Python следующим образом:

      # pip install lightphe
from lightphe import LightPHE
 
# build a cryptosystem
cs = LightPHE(algorithm_name = 'Paillier')
modulo = cs.cs.plaintext_modulo
 
# define plaintexts
m1 = -10
 
# calculate ciphertexts
c1 = cs.encrypt(m1)
 
# performing homomorphic addition on ciphertexts
assert cs.decrypt(c1) == m1 % modulo
Другие вопросы по тегам