鏈榪戝畨瑁呬簡涓涓狫IRA,欏轟究鐮旂┒浜嗕竴涓嬪畠鐨勬敞鍐屾満鍒訛紝灞炰簬涓涓吀鍨嬬殑DSA絳懼悕綆楁硶鐨勫疄鐜幫紝鎸夌収甯哥悊錛屽緢鑷劧鐨勬兂鍒拌嚜宸辯敓鎴愪竴瀵筽ublickey鍜宲rivatekey鏇挎崲鎺夊師鏉ヨ蔣浠跺甫鐨刾ublickey錛屽氨鍙互鐢熸垚鑷繁鐨勬敞鍐岀爜浜嗐?BR>浣嗘槸鎼炲畾鎵嶅彂鐜扮綉涓婃湁寰堝鐨勬敞鍐屾満錛屾兂涓嶅埌DSA綆楁硶鐨刾rivatekey涔熸湁浜鴻兘澶熷垎鏋愬嚭鏉ワ紵錛熺粡榪囬獙璇侊紝浜嬪疄灝辨憜鍦ㄩ潰鍓嶄簡錛岀殑紜粠JIRA 2.6.1寮濮嬭繖瀵瑰瘑鍖欏氨娌″彉榪囷紝鎵浠ユ敞鍐屾満灝卞彲浠ヤ竴鐩存部鐢ㄥ埌鐜板湪浜嗭紝闅鵑亾鍦ㄦ棭鏈熺殑鐗堟湰涓嶅皬蹇冨皢縐佸寵緇欐硠婕忓嚭鏉ヤ簡錛熸垨鑰呮墍璋撶殑榛戝鐪熺殑鐮磋В浜咼IRA鐨勫瘑鍖欙紵
棣栧厛鍒嗘瀽涓涓婮IRA鐨勫唴閮ㄦ満鍒訛紝涓庢敞鍐岀浉鍏崇殑瀵硅薄閮芥斁鍦╟om.atlassian.license鍖呬笅闈紝鍏朵腑publickey鐨勬枃浠跺悕鏄痓ug.class,鍦╟om\atlassian\jira\issue涓嬮潰錛屽叾涓璚EB-INF\classes鍜宎tlassian-extras-0.7.10.jar涓悇鏈変竴涓傚埄鐢ㄤ笅闈唬鐮佸氨鍙互璇誨嚭publickey鐨勫唴瀹逛簡錛?BR>
InputStream keyfis=new FileInputStream(pubfilename);
byte encKey[] = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PublicKey pubkey=keyFactory.generatePublic(pubKeySpec);
DSAPublicKeySpec pubkeyspec=(DSAPublicKeySpec) keyFactory.getKeySpec(pubkey, DSAPublicKeySpec.class);
System.out.println("P="+pubkeyspec.getP());
System.out.println("Q="+pubkeyspec.getQ());
System.out.println("G="+pubkeyspec.getG());
System.out.println("Y="+pubkeyspec.getY());
榪愯緇撴灉濡備笅錛?BR>
P=178011905478542266528237562450159990145232156369120674273274450314442865788737020770612695252123463079567156784778466449970650770920727857050009668388144034129745221171818506047231150039301079959358067395348717066319802262019714966524135060945913707594956514672855690606794135837542707371727429551343320695239
Q=864205495604807476120572616017955259175325408501
G=174068207532402095185811980123523436538604490794561350978495831040599953488455823147851597408940950725307797094915759492368300574252438761037084473467180148876118103083043754985190983472601550494691329488083395492313850000361646482644608492304078721818959999056496097769368017749273708962006689187956744210730
Y=104878378611578608516131988304241730575226860461304117604293580069983220227094632807881557460560834347944389679413307090500106772833435437017122610074687673247552012771759005247409187709312922876281831426019398155097541955193653855246734321859930303643524786168850036251099739995507172205951987756012523624501

濡傛灉鏈夊叴瓚e彲浠ヤ粠榪欓噷鍏ユ墜鍘繪壘瀵籶rivatekey鐨刋,闅懼害鍙兂鑰岀煡錛屼絾鏄湪緗戜笂鍙互涓嬭澆鐨勬敞鍐屾満涓氨鏈塜,涓嶇浣犳槸鍚︾浉淇★紝鐪熻浜烘鐤慏SA鐨勫畨鍏ㄦэ紝鍊煎涓嬶細
X=240907294874328356661328650403099424255880489796
榪欎笅灝卞彲浠ュ緢鏂逛究鐨勭敓鎴愭敞鍐岀爜浜嗭細
鏄庢枃錛歭icenseTypeCode ^ dateCreated ^ datePurchased ^ organisation
鍏朵腑licenseTypeCode =267灝辨槸JIRA Enterprise: Commercial Server
dateCreated =datePurchased =new Date()灝卞彲浠ヤ簡
organisation闅忎究
浠g爜濡備笅錛?BR>
import com.atlassian.license.LicensePair;

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.Signature;
import java.security.interfaces.DSAPrivateKey;
import java.security.spec.DSAPrivateKeySpec;
import java.util.Date;


public class JIRAKeyGen
{

public static void main(String[] args)
{
Date dt = new Date();
long d = dt.getTime();
BigInteger x = new BigInteger("240907294874328356661328650403099424255880489796");
BigInteger p = new BigInteger("178011905478542266528237562450159990145232156369120674273274450314442865788737020770612695252123463079567156784778466449970650770920727857050009668388144034129745221171818506047231150039301079959358067395348717066319802262019714966524135060945913707594956514672855690606794135837542707371727429551343320695239");
BigInteger q = new BigInteger("864205495604807476120572616017955259175325408501");
BigInteger g = new BigInteger("174068207532402095185811980123523436538604490794561350978495831040599953488455823147851597408940950725307797094915759492368300574252438761037084473467180148876118103083043754985190983472601550494691329488083395492313850000361646482644608492304078721818959999056496097769368017749273708962006689187956744210730");

try
{
DSAPrivateKeySpec keyspec = new DSAPrivateKeySpec(x, p, q, g);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
DSAPrivateKey prikey = (DSAPrivateKey) keyFactory.generatePrivate(keyspec);
String messageString = "267^" + d + "^" + d + "^blogjava";
//鐢熸垚絳懼悕hash
Signature signature = Signature.getInstance("SHA1withDSA");
signature.initSign(prikey);
signature.update(messageString.getBytes());
byte[] lichash = signature.sign();
//緙栫爜
LicensePair pair = new LicensePair(messageString.getBytes(), lichash);
System.out.println(pair.toString());

} catch (Exception ex)
{
ex.printStackTrace();
}
}
}

褰撶劧榪樻湁鍙﹀涓縐嶆柟娉曪紝鑷繁鐢熸垚DSA綆楁硶鐨刱ey錛岀劧鍚庤鐩栧師鏉ョ殑bug.class,鍒╃敤涓庝笂闈㈢浉鍚岀殑鍔炴硶灝卞彲浠ョ敓鎴恖icense浜嗐?BR>紺轟緥浠g爜濡備笅錛?BR>

public void genDSAKey()
{

try
{
//鐢熸垚DSA key
KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA");
KeyPair kp = gen.genKeyPair();
DSAPublicKey pubkey = (DSAPublicKey) kp.getPublic();
DSAPrivateKey prikey = (DSAPrivateKey) kp.getPrivate();
saveEncodedData(pubkey.getEncoded(), "bug.class");
saveEncodedData(prikey.getEncoded(), "privatekey.key");
//絳懼悕璁$畻錛屼笅嬈¢渶瑕佺洿鎺ヤ粠鏂囦歡涓鍙杙rivatekey.key,鍒濆鍖杙rikey
Signature signature = Signature.getInstance("SHA1withDSA");
signature.initSign(prikey);
Date dt=new Date();
long d = dt.getTime();
String messageString = "267^" + d + "^" + d + "^blogjava";
System.out.println(dt.getTime());
signature.initSign(prikey);
signature.update(messageString.getBytes());
byte[] lichash=signature.sign();
LicensePair pair=new LicensePair(messageString.getBytes(),lichash);
System.out.println(pair.toString());

} catch (Exception ex)
{
ex.printStackTrace();
}
}


public boolean saveEncodedData(byte[] data, String filename)
{
boolean res = true;

try
{
FileOutputStream fs = new FileOutputStream(filename);
fs.write(data);
fs.close();

} catch (Exception ex)
{
res = false;
ex.printStackTrace();
}
return res;
}
娉ㄦ剰涓婇潰鐨勪唬鐮侀渶瑕佽皟鐢╝tlassian-extras-0.7.10,鍦╓EB-INF\lib鐩綍涓嬮潰鍙互鎵懼埌

]]>