📄 elgamalencryptor.java
字号:
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -