Learning
Doing is better than saying, So the world wags

方案如下

尝试使用NTL编写该方案加密1位二进制,代码如下:

#include <iostream>
#include <NTL/ZZ.h>
#include <NTL/vector.h>
#include <NTL/matrix.h>
#include <NTL/vec_vec_ZZ.h>
#include <NTL/mat_ZZ.h>
#include <NTL/vec_ZZ.h>

using namespace std;
using namespace NTL;

long i, j, n = 256, q = 256, N = n + 1;
/* 随机数m以内 */
// RandomBnd(m);
/* 四舍五入 */
ZZ rounds(ZZ x, ZZ y)
{
	if (x < 0) {
		return -((-x + (y / 2)) / y);
	}
	else {
		return (x + (y / 2)) / y;
	}
}
/* 私钥 */
vec_ZZ SecretKeygen()
{
	vec_ZZ s1, sk;
	s1.SetLength(n);
	for (i = 0; i < n; i++) {
		s1[i] = operator%((ZZ)RandomBnd(n), q);
	}
	sk.SetLength(n + 1);
	sk[0] = 1;
	for (i = 1; i < n + 1; i++) {
		sk[i] = operator%(s1[i - 1], q);
	}
	return sk;
}
/* 公钥 */
mat_ZZ PublicKeygen(vec_ZZ sk)
{
	mat_ZZ A1;
	A1.SetDims(N, n);
	for (i = 0; i < N; i++) {
		for (j = 0; j < n; j++) {
			A1[i][j] = operator%((ZZ)RandomBnd(n), q);
		}
	}
	vec_ZZ e;
	e.SetLength(N);
	for (i = 0; i < N; i++) {
		e[i] = RandomBnd(3) - 1;
	}
	vec_ZZ s1, b1, b;
	s1.SetLength(n);
	for (i = 0; i < n; i++) {
		s1[i] = sk[i + 1];
	}
	mul(b1, A1, s1);
	add(b, b1, e);
	mat_ZZ A;
	A.SetDims(N, n + 1);
	for (i = 0; i < N; i++) {
		A[i][0] = operator%(b[i], q);
		for (j = 0; j < n; j++) {
			A[i][j + 1] = operator%((-A1[i][j]), q);
		}
	}
	return A;
}
/* 加密 */
vec_ZZ Enc(mat_ZZ pk, long input)
{
	vec_ZZ m, r, c, c1, c2;
	m.SetLength(n + 1);
	m[0] = input;
	r.SetLength(N);
	for (i = 0; i < r.length(); i++) {
		r[i] = 0;
	}
	mat_ZZ A2, A;
	A = pk;
	transpose(A2, A);
	c1 = rounds((ZZ)q, (ZZ)2) * m;
	mul(c2, A2, r);
	add(c, c1, c2);
	return c;
}
/* 解密 */
ZZ Dec(vec_ZZ sk, vec_ZZ enc)
{
	ZZ inner, inn;
	inner = 0;
	InnerProduct(inner, sk, enc);
	inn = rounds(inner*(ZZ)2, (ZZ)q);
	return operator%(inn, (ZZ)2);
}
int main()
{
	vec_ZZ sk = SecretKeygen();
	if (IsZero(sk) == 0) {
		cout << "私钥已生成" << "\n";
		//cout << sk << "\n";
	}
	mat_ZZ pk = PublicKeygen(sk);
	if (IsZero(pk) == 0) {
		cout << "公钥已生成" << "\n";
		//cout << pk << "\n";
	}
	cout << "请输入密文(1位1或0):";
	long input;
	cin >> input;
	vec_ZZ enc = Enc(pk, input);
	/*if(IsZero(enc) == 0){
		cout << "密文已加密" << "\n";
		//cout << enc << "\n";
	}*/
	ZZ dec = Dec(sk, enc);
	if (dec == (ZZ)input) {
		cout << "解密:";
		cout << dec << "\n";
	}
	else {
		cout << "错误\n";
	}
}

自测正确,如有问题,欢迎讨论。

发表评论