elgamalencryptor.java

来自「Java version of ABC/HR comparator v0.5. 」· Java 代码 · 共 36 行

JAVA
36
字号
package abchr.crypto;

import java.math.BigInteger;
import java.util.Random;
import java.security.SecureRandom;

public class ElGamalEncryptor implements Encryptor {
	public static final SecureRandom rand=new SecureRandom();

	private ElGamalPublicKey key;

	public ElGamalEncryptor(ElGamalPublicKey key) {
		this.key=key;
	}

	public byte[] encrypt(byte[] data) {
		byte[] modData=new byte[data.length+1];
		modData[0]=1;
		System.arraycopy(data,0,modData,1,data.length);
		BigInteger plainText=new BigInteger(modData);
		BigInteger x;
		do {
			x=new BigInteger(key.getModulus().bitLength(),rand);
		} while(x.compareTo(BigInteger.ONE)<=0 || x.compareTo(key.getModulus())>=0);
		BigInteger y=key.getGenerator().modPow(x,key.getModulus());
		BigInteger encryptedText=key.getPublicKey().modPow(x,key.getModulus()).multiply(plainText).remainder(key.getModulus());
		byte[] yBytes=y.toByteArray();
		byte[] encryptedTextBytes=encryptedText.toByteArray();
		byte[] out=new byte[yBytes.length+encryptedTextBytes.length+8];
		Util.intToByteArray(yBytes.length,out,0);
		Util.intToByteArray(encryptedTextBytes.length,out,4);
		System.arraycopy(yBytes,0,out,8,yBytes.length);
		System.arraycopy(encryptedTextBytes,0,out,8+yBytes.length,encryptedTextBytes.length);
		return out;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?