function [x3,y3,lamda]=add(x1,y1,x2,y2,a,p)
%方法(Elgamal密码系统):
%1. 选取p约等于2^180和整数a, b得到群Ep(a, b), 公开;
%2. 选取generator point G=(x1, y1), 满足:G的阶n是一个非常大的素数,公开;
%3. Alice 选取nA<n为私人密钥,并产生公开密钥PA=nA?G是Ep(a, b)中的点;
%4. Bob选取nB<n为私人密钥,并产生公开密钥PB=nB?G是Ep(a, b)中的点;
%5. Alice, Bob分别产生秘密密钥: K= nA*PB= nA*(nB*G)= nB*PA.
%加密:
% Alice要发报文Pm给Bob,取随机数k,并将Pm加密为:
% Cm={kG, Pm+kPB}
%解密(Bob):
% Pm+kPB?nB(kG) = Pm+k(nBG)-nB(kG)=Pm
%例:考虑E11(1,6)上的点,G=(2,7),计算2G到13G的值
%2G=G+G
%对应的命令为 (x,y)=add(2,7,2,7,1,11)
if x1==x2 & y1==y2
lamda=rem((3*x1^2+a)*myinver(2*y1,p),p);
else
lamda=rem((y2-y1)*myinver(x2-x1,p),p);
end
if la
%方法(Elgamal密码系统):
%1. 选取p约等于2^180和整数a, b得到群Ep(a, b), 公开;
%2. 选取generator point G=(x1, y1), 满足:G的阶n是一个非常大的素数,公开;
%3. Alice 选取nA<n为私人密钥,并产生公开密钥PA=nA?G是Ep(a, b)中的点;
%4. Bob选取nB<n为私人密钥,并产生公开密钥PB=nB?G是Ep(a, b)中的点;
%5. Alice, Bob分别产生秘密密钥: K= nA*PB= nA*(nB*G)= nB*PA.
%加密:
% Alice要发报文Pm给Bob,取随机数k,并将Pm加密为:
% Cm={kG, Pm+kPB}
%解密(Bob):
% Pm+kPB?nB(kG) = Pm+k(nBG)-nB(kG)=Pm
%例:考虑E11(1,6)上的点,G=(2,7),计算2G到13G的值
%2G=G+G
%对应的命令为 (x,y)=add(2,7,2,7,1,11)
if x1==x2 & y1==y2
lamda=rem((3*x1^2+a)*myinver(2*y1,p),p);
else
lamda=rem((y2-y1)*myinver(x2-x1,p),p);
end
if la