初写regev05加密方案


这是一个密码学领域的经典加密方案,在这里我尝试使用C++的NTL库进行编写
方案如下:
rege

代码:


#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以内 /
long random(long num)
{
    return RandomBnd(num);
}
/ 四舍五入 /
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)random(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++) {
            A1i = operator%((ZZ)random(n), q);
        }
    }
    vec_ZZ e;
    e.SetLength(N);
    for (i = 0; i < N; i++) {
        e[i] = random(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++) {
        Ai = operator%(b[i], q);
        for (j = 0; j < n; j++) {
            Ai = operator%((-A1i), 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 << "请输入密文:";
    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";
    }
}

声明:有限可能|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 初写regev05加密方案


Something for nothing