基于Ring-LWE的Java客户端-服务器加密聊天应用字符乱序问题
基于Ring-LWE的Java安全聊天应用解密字符错误问题
我正在为密码学与安全项目开发一款基于Ring-LWE的客户端-服务器架构Java安全聊天应用。目前已实现密钥交换、加密及解密逻辑,但出现字符被替换的问题,测试输出如下:
- hello -> gelko
- help -> gekp
我尝试过增大缩放因子和误差系数,但问题仍未解决。我清楚Ring-LWE不适用于实时语音和文件加密,此仅为项目用途。
包含Ring-LWE实现的Client.java代码
class RingLWE { private final int n = 512; private final int q = 12289; private final int scalingFactor = q / 256; //48 private int[] s; public RingLWE() { Random random = new Random(); s = new int[n]; for (int i = 0; i < n; i++) { s[i] = random.nextInt(3) - 1; // Coefficients in {-1, 0, 1} } } // public key (a, b) public int[][] generatePublicKey() { Random random = new Random(); int[] a = new int[n]; int[] e = new int[n]; int[] b = new int[n]; // polynomial a for (int i = 0; i < n; i++) { a[i] = random.nextInt(q); } // error polynomial e for (int i = 0; i < n; i++) { e[i] = random.nextInt(3) - 1; // Coefficients in {-1, 0, 1} } // b = a * s + e mod q b = polyAdd(polyMul(a, s), e); for (int i = 0; i < n; i++) { b[i] = modq(b[i]); } return new int[][]{a, b}; } public int[] encryptByte(int message, int[] a, int[] b) { Random random = new Random(); // polynomial r int[] r = new int[n]; for (int i = 0; i < n; i++) { r[i] = random.nextInt(3) - 1; // Coefficients in {-1, 0, 1} } // error polynomials e1 and e2 int[] e1 = new int[n]; int[] e2 = new int[n]; for (int i = 0; i < n; i++) { e1[i] = random.nextInt(3) - 1; e2[i] = random.nextInt(3) - 1; } // u = a * r + e1 mod q int[] u = polyAdd(polyMul(a, r), e1); for (int i = 0; i < n; i++) { u[i] = modq(u[i]); } int[] m = new int[n]; m[0] = message; // v = b * r + e2 + m * scalingFactor mod q int[] scaledM = scalarMul(m, scalingFactor); int[] v = polyAdd(polyAdd(polyMul(b, r), e2), scaledM); for (int i = 0; i < n; i++) { v[i] = modq(v[i]); } int[] ciphertext = new int[2 * n]; System.arraycopy(u, 0, ciphertext, 0, n); System.arraycopy(v, 0, ciphertext, n, n); return ciphertext; } public int decryptByte(int[] ciphertext) { int[] u = new int[n]; int[] v = new int[n]; System.arraycopy(ciphertext, 0, u, 0, n); System.arraycopy(ciphertext, n, v, 0, n); // m' = v - u * s mod q int[] us = polyMul(u, s); int[] mPrime = polySub(v, us); for (int i = 0; i < n; i++) { mPrime[i] = modq(mPrime[i]); } int decryptedMessage = (int) Math.round((double) mPrime[0] / scalingFactor); decryptedMessage = decryptedMessage % 256; if (decryptedMessage < 0) decryptedMessage += 256; return decryptedMessage; } // Polynomial multiplication modulo x^n + 1 private int[] polyMul(int[] a, int[] b) { int[] result = new int[n]; for (int i = 0; i < n; i++) { long sum = 0; for (int j = 0; j < n; j++) { int index = (i - j) % n; if (index < 0) index += n; int sign = (((i - j) >= 0) ? 1 : -1); sum += (long) sign * a[j] * b[index]; } result[i] = modq((int) sum); } return result; } private int[] polyAdd(int[] a, int[] b) { int[] result = new int[n]; for (int i = 0; i < n; i++) { result[i] = modq(a[i] + b[i]); } return result; } private int[] polySub(int[] a, int[] b) { int[] result = new int[n]; for (int i = 0; i < n; i++) { result[i] = modq(a[i] - b[i]); } return result; } private int[] scalarMul(int[] a, int scalar) { int[] result = new int[n]; for (int i = 0; i < n; i++) { result[i] = modq(a[i] * scalar); } return result; } private int modq(int x) { int result = x % q; if (result < 0) result += q; return result; } }
内容的提问来源于stack exchange,提问作者SDG8
相关产品推荐
相关产品推荐

