라이센스 응용 프로그램의 공개 키 또는 개인 키를 사용하여 생성 된 키의 크기를 일치시킬 수 없습니다. 공개/개인 키를 생성하고, 공개 키로 사용자 emailaddress에 서명하여 라이센스를 만든 다음 공개 키, 라이센스 및 전자 메일 주소를 사용하여 라이센스가 개인 키를 사용하여 실제로 인코딩되었음을 확인하는 자체 포함 예제를 작성했습니다 (분명히 모두 한 클래스에 있어야합니다).Java에서 32 또는 16 바이트 키를 생성하는 서명 알고리즘을 찾으십시오.
라이센스 키의 16 진수 버전은 96 자 (즉, 48 바이트/384 비트를 나타냄)이지만 원하는 것보다 약간 길지만 (공용/개인 키의 길이는 문제가되지 않으며 더 길수록 좋습니다.) 32 (64 진수 문자) 바이트 또는 16 바이트 (32 진수 문자)를 생성하는 데 사용할 수있는 것이 무엇입니까? 다른 알고리즘을 따기
는 알고리즘이
Signature.getInstance("SHA/DSA");
에 서명 키
KeyPairGenerator.getInstance("DSA");
및 알고리즘을 생성 집어 사이에 나는 상호 작용을 이해하지 않는 다소 어렵고 나는를 찾을 수 없습니다 둘 중 하나에 대한 목록.
나는 공개/개인 키 쌍을 생성 할 때 내가 키
keyGen.initialize(1024, new SecureRandom());
의 크기 아직 어느 것도 공개 키 (443 바이트) 또는 개인 키 (335 바이트) 또는 둘의 합을 지정하는 하나 다른 점 (778 바이트)이이 번호와 일치합니다.
import org.apache.commons.codec.binary.Hex;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
*
*/
public class CreateLicense
{
private String PUBLIC_KEY;
private String PRIVATE_KEY;
public static void main(final String[] args)
{
try
{
String email = args[0];
System.out.println("Creating license for:"+email);
CreateLicense cl = new CreateLicense();
cl.generatePublicPrivateKeyPair();
String license = cl.createLicense(email);
cl.checkLicense(email, license);
}
catch(Throwable t)
{
t.printStackTrace();
}
}
//Would only be done once on server
private void generatePublicPrivateKeyPair() throws Exception
{
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024, new SecureRandom());
final KeyPair pair = keyGen.generateKeyPair();
PrivateKey privateKey = pair.getPrivate();
PRIVATE_KEY=Hex.encodeHexString(privateKey.getEncoded());
PublicKey publicKey = pair.getPublic();
PUBLIC_KEY=Hex.encodeHexString(publicKey.getEncoded());
System.out.println("PrivateKeyHexLength:"+privateKey.getEncoded().length);
System.out.println("PublicKeyHexLength:"+publicKey.getEncoded().length);
}
private PrivateKey reinflatePrivateKey(String keyAsHexString) throws Exception
{
byte[] keyBytes = Hex.decodeHex(keyAsHexString.toCharArray());
final PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(keyBytes);
final KeyFactory keyFactory = KeyFactory.getInstance("DSA");
final PrivateKey privateKey = keyFactory.generatePrivate(privKeySpec);
return privateKey;
}
private PublicKey reinflatePublicKey(String keyAsHexString) throws Exception
{
byte[] keyBytes = Hex.decodeHex(keyAsHexString.toCharArray());
final X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes);
final KeyFactory keyFactory = KeyFactory.getInstance("DSA");
final PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
return publicKey;
}
//License Create on server based on email address
private String createLicense(String emailAddress) throws Exception
{
String message=emailAddress;
PrivateKey privateKey = reinflatePrivateKey(PRIVATE_KEY);
final Signature dsa = Signature.getInstance("SHA/DSA");
dsa.initSign(privateKey);
dsa.update(message.getBytes());
final byte[] m1 = dsa.sign();
String license = Hex.encodeHexString(m1);
System.out.println("CreateLicense:"+license+":Size:"+license.length());
return license;
}
//Client checks that given known emailaddress and public key that a if a license was derived from
//that and corresponding privatekey it would match license.
private boolean checkLicense(String emailAddress, String license) throws Exception
{
String message=emailAddress;
PublicKey publicKey = reinflatePublicKey(PUBLIC_KEY);
final Signature dsa = Signature.getInstance("SHA/DSA");
dsa.initVerify(publicKey);
dsa.update(message.getBytes());
boolean result = dsa.verify(Hex.decodeHex(license.toCharArray()));
System.out.println("Result"+result);
return result;
}
}
는
Creating license for:[email protected]
PrivateKeyHexLength:335
PublicKeyHexLength:443
CreateLicense:302c021425f7ad7289b073f82a1d808838f43e0134c5591402140d2a7a4e3967706d4659dc73ace6455040a5fc6b:Size:92
Resulttrue