Может ли криптосистема подсистемы шифровать и дешифровать отрицательные большие целые числа?
Я использую криптосистему 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