2012-09-03 2 views
0

라이센스 응용 프로그램의 공개 키 또는 개인 키를 사용하여 생성 된 키의 크기를 일치시킬 수 없습니다. 공개/개인 키를 생성하고, 공개 키로 사용자 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 

답변

0

@ 폴과 같은 출력을 제공 - 내가 여기 당신의 솔루션 ECDSA를 사용하는 것입니다 생각합니다.

final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA"); 

에 코드

final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); 

당신의 라인을 변경 키는 DSA보다 훨씬 짧은 - 있는지 진수 버전의 서명이 짧은 것이 난. 256 또는 128 비트라고 말하는 소수의 ECC 곡선을 사용하는 것이 좋습니다.

문제가 해결되는지 알려주세요.

관련 문제