接下来咱们介绍DSA数字签名,非对称加密的另外一种实现。
DSA
DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST做为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用做数字签名。不仅仅只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。若是数据和签名不匹配则认为验证失败!数字签名的做用就是校验数据在传输过程当中不被修改。数字签名,是单向加密的升级!
java
经过java代码实现以下:Coder类见 Java加密技术(一) git
- import java.security.Key;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.SecureRandom;
- import java.security.Signature;
- import java.security.interfaces.DSAPrivateKey;
- import java.security.interfaces.DSAPublicKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- import java.util.HashMap;
- import java.util.Map;
-
- public abstract class DSACoder extends Coder {
-
- public static final String ALGORITHM = "DSA";
-
-
- private static final int KEY_SIZE = 1024;
-
-
- private static final String DEFAULT_SEED = "0f22507a10bbddd07d8a3082122966e3";
-
- private static final String PUBLIC_KEY = "DSAPublicKey";
- private static final String PRIVATE_KEY = "DSAPrivateKey";
-
-
- public static String sign(byte[] data, String privateKey) throws Exception {
-
- byte[] keyBytes = decryptBASE64(privateKey);
-
-
- PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
-
-
- KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
-
-
- PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
-
-
- Signature signature = Signature.getInstance(keyFactory.getAlgorithm());
- signature.initSign(priKey);
- signature.update(data);
-
- return encryptBASE64(signature.sign());
- }
-
-
- public static boolean verify(byte[] data, String publicKey, String sign)
- throws Exception {
-
-
- byte[] keyBytes = decryptBASE64(publicKey);
-
-
- X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
-
-
- KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
-
-
- PublicKey pubKey = keyFactory.generatePublic(keySpec);
-
- Signature signature = Signature.getInstance(keyFactory.getAlgorithm());
- signature.initVerify(pubKey);
- signature.update(data);
-
-
- return signature.verify(decryptBASE64(sign));
- }
-
-
- public static Map<String, Object> initKey(String seed) throws Exception {
- KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);
-
- SecureRandom secureRandom = new SecureRandom();
- secureRandom.setSeed(seed.getBytes());
- keygen.initialize(KEY_SIZE, secureRandom);
-
- KeyPair keys = keygen.genKeyPair();
-
- DSAPublicKey publicKey = (DSAPublicKey) keys.getPublic();
- DSAPrivateKey privateKey = (DSAPrivateKey) keys.getPrivate();
-
- Map<String, Object> map = new HashMap<String, Object>(2);
- map.put(PUBLIC_KEY, publicKey);
- map.put(PRIVATE_KEY, privateKey);
-
- return map;
- }
-
-
- public static Map<String, Object> initKey() throws Exception {
- return initKey(DEFAULT_SEED);
- }
-
-
- public static String getPrivateKey(Map<String, Object> keyMap)
- throws Exception {
- Key key = (Key) keyMap.get(PRIVATE_KEY);
-
- return encryptBASE64(key.getEncoded());
- }
-
-
- public static String getPublicKey(Map<String, Object> keyMap)
- throws Exception {
- Key key = (Key) keyMap.get(PUBLIC_KEY);
-
- return encryptBASE64(key.getEncoded());
- }
- }
再给出一个测试类: 算法
- import static org.junit.Assert.*;
-
- import java.util.Map;
-
- import org.junit.Test;
-
- public class DSACoderTest {
-
- @Test
- public void test() throws Exception {
- String inputStr = "abc";
- byte[] data = inputStr.getBytes();
-
-
- Map<String, Object> keyMap = DSACoder.initKey();
-
-
- String publicKey = DSACoder.getPublicKey(keyMap);
- String privateKey = DSACoder.getPrivateKey(keyMap);
-
- System.err.println("公钥:\r" + publicKey);
- System.err.println("私钥:\r" + privateKey);
-
-
- String sign = DSACoder.sign(data, privateKey);
- System.err.println("签名:\r" + sign);
-
-
- boolean status = DSACoder.verify(data, publicKey, sign);
- System.err.println("状态:\r" + status);
- assertTrue(status);
-
- }
-
- }
控制台输出: 安全
- 公钥:
- MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZp
- RV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fn
- xqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuE
- C/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJ
- FnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImo
- g9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAIu4RUlcQLp49PI0MrbssOY+3uySVnp0TULSv
- 5T4VaHoKzsLHgGTrwOvsGA+V3yCNl2WDu3D84bSLF7liTWgOj+SMOEaPk4VyRTlLXZWGPsf1Mfd9
- 21XAbMeVyKDSHHVGbMjBScajf3bXooYQMlyoHiOt/WrCo+mv7efstMM0PGo=
-
- 私钥:
- MIIBTAIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2
- USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4
- O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmC
- ouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCB
- gLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhR
- kImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoEFwIVAIegLUtmm2oQKQJTOiLugHTSjl/q
-
- 签名:
- MC0CFQCMg0J/uZmF8GuRpr3TNq48w60nDwIUJCyYNah+HtbU6NcQfy8Ac6LeLQs=
-
- 状态:
- true
注意状态为true,就验证成功!
dom