Java中,字符串转换为一个RSA公钥 [英] Java, convert string to a RSA publicKey

查看:8423
本文介绍了Java中,字符串转换为一个RSA公钥的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图吨字符串转换重新公钥presentation成一个公钥java对象使用对数据进行加密,但我不断收到以下以下错误:

  java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException异常:检测premature EOF
    在sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
    在java.security.KeyFactory.generatePublic(KeyFactory.java:304)
    在com.josh.crypto.CryptoUtil.convertKeytoKeyObject(CryptoUtil.java:96)
    在com.josh.crypto.CryptoUtil.encryptData(CryptoUtil.java:78)
    在com.josh.ui.EncryptionView $ 2.actionPerformed(EncryptionView.java:112)
    在javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    在javax.swing.AbstractButton中的$ Handler.actionPerformed(AbstractButton.java:2351)
    在javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    在javax.swing.DefaultButtonModel.set pressed(DefaultButtonModel.java:242)
    在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    在java.awt.Component.processMouseEvent(Component.java:6382)
    在javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    在java.awt.Component.processEvent(Component.java:6147)
    在java.awt.Container.processEvent(Container.java:2083)
    在java.awt.Component.dispatchEventImpl(Component.java:4744)
    在java.awt.Container.dispatchEventImpl(Container.java:2141)
    在java.awt.Component.dispatchEvent(Component.java:4572)
    在java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
    在java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
    在java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
    在java.awt.Container.dispatchEventImpl(Container.java:2127)
    在java.awt.Window.dispatchEventImpl(Window.java:2489)
    在java.awt.Component.dispatchEvent(Component.java:4572)
    在java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704)
    在java.awt.EventQueue.access $ 400(EventQueue.java:82)
    在java.awt.EventQueue中的$ 2.run(EventQueue.java:663)
    在java.awt.EventQueue中的$ 2.run(EventQueue.java:661)
    在java.security.AccessController.doPrivileged(本机方法)
    在java.security.AccessControlContext $ 1.doIntersectionPrivilege(​​AccessControlContext.java:87)
    在java.security.AccessControlContext $ 1.doIntersectionPrivilege(​​AccessControlContext.java:98)
    在java.awt.EventQueue中的$ 3.run(EventQueue.java:677)
    在java.awt.EventQueue中的$ 3.run(EventQueue.java:675)
    在java.security.AccessController.doPrivileged(本机方法)
    在java.security.AccessControlContext $ 1.doIntersectionPrivilege(​​AccessControlContext.java:87)
    在java.awt.EventQueue.dispatchEvent(EventQueue.java:674)
    在java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    在java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    在java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.security.InvalidKeyException:引起IOException异常:检测premature EOF
    在sun.security.x509.X509Key.de code(X509Key.java:380)
    在sun.security.x509.X509Key.de code(X509Key.java:386)
    在sun.security.rsa.RSAPublicKeyImpl<&初始化GT;(RSAPublicKeyImpl.java:66)
    在sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:281)
    在sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184)
    ... 40更多

下面是code段

 私人公钥convertKeytoKeyObject(字符串公钥)
            抛出抛出:NoSuchAlgorithmException,InvalidKeySpecException,NoSuchProviderException {
        字节[]键= Base64.en codeBase64(publicKey.getBytes());
        x509KeySpec =新X509En codedKeySpec(键);
        的KeyFactory = KeyFactory.getInstance(Keys.RSA);
        返回keyFactory.generatePublic(x509KeySpec);}

我得到的错误,当我调用generatePublic方法。

使用键IM

  ---- BEGIN SSH2 PUBLIC KEY ----
评论:RSA的密钥-20130520
AAAAB3NzaC1yc2EAAAABJQAAAIEAsE8aR2CIWuQgkeOsPhHDuGo + Rokr2cT + KS5L
sJFbEkB0R3XYXnOT3DU0CFrmHUX1PpcfTOSdxCIfeSXFHCGGWEXm4qx7ptNpm4vP
Scuzmlr / fjuQdb7lBQ0 + OEP2LKuRHxt5oEVZvq / EvwENS5T2BiVUSvTwXUS6SKCh
ERydjXE =
---- END SSH2 PUBLIC KEY ----1023 37 76983149213904336854114697871156413897597333013960300274862161645944637611303244321149406756964434094764396730933825927553585120754675001147670015123442685209165940390638704889262818745065195784329243512386761389890962501775294435871155079992876425567019740053306097979712960040526841676998224241040015724649 RSA的密钥,20130520


解决方案

密钥文件看起来OK。如果你给整个文件到您的方法作为一个字符串,则该方法将尝试连接code这已经是Base64编码的连接codeD的关键。

您可以创建(和使用)键是这样的:

 的SecureRandom兰特=新的SecureRandom();
KeyPairGenerator的根= NULL;
尝试{
    根= KeyPairGenerator.getInstance(DSA);
    }
赶上(抛出:NoSuchAlgorithmException E){
    通信System.err.println(e.getMessage());
}
gen.initialize(1024兰特);
密钥对密钥= gen.generateKeyPair();// -----写密钥导出到文件
公钥PUBKEY = keys.getPublic();
writeKeyToFile(PUBKEY,FILE_PUBLIC_KEY);
     的System.out.println(pubkey.toString());
PrivateKey的privKey = keys.getPrivate();
writeKeyToFile(的privKey,FILE_PRIVATE_KEY);

i am trying ton convert a string representation of a public key into a publicKey java object use to encrypt data but i keep getting the following error below:

   java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: Detect premature EOF
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:304)
    at com.josh.crypto.CryptoUtil.convertKeytoKeyObject(CryptoUtil.java:96)
    at com.josh.crypto.CryptoUtil.encryptData(CryptoUtil.java:78)
    at com.josh.ui.EncryptionView$2.actionPerformed(EncryptionView.java:112)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6382)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6147)
    at java.awt.Container.processEvent(Container.java:2083)
    at java.awt.Component.dispatchEventImpl(Component.java:4744)
    at java.awt.Container.dispatchEventImpl(Container.java:2141)
    at java.awt.Component.dispatchEvent(Component.java:4572)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
    at java.awt.Container.dispatchEventImpl(Container.java:2127)
    at java.awt.Window.dispatchEventImpl(Window.java:2489)
    at java.awt.Component.dispatchEvent(Component.java:4572)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:663)
    at java.awt.EventQueue$2.run(EventQueue.java:661)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$3.run(EventQueue.java:677)
    at java.awt.EventQueue$3.run(EventQueue.java:675)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:674)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.security.InvalidKeyException: IOException: Detect premature EOF
    at sun.security.x509.X509Key.decode(X509Key.java:380)
    at sun.security.x509.X509Key.decode(X509Key.java:386)
    at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:66)
    at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:281)
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184)
    ... 40 more

Here is code snippet

private PublicKey convertKeytoKeyObject(String publicKey)
            throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
        byte[] key = Base64.encodeBase64(publicKey.getBytes());
        x509KeySpec = new X509EncodedKeySpec(key);
        keyFactory = KeyFactory.getInstance(Keys.RSA);
        return keyFactory.generatePublic(x509KeySpec);

}

i get the error when i invoke the generatePublic method.

key im using

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20130520"
AAAAB3NzaC1yc2EAAAABJQAAAIEAsE8aR2CIWuQgkeOsPhHDuGo+Rokr2cT+KS5L
sJFbEkB0R3XYXnOT3DU0CFrmHUX1PpcfTOSdxCIfeSXFHCGGWEXm4qx7ptNpm4vP
Scuzmlr/fjuQdb7lBQ0+OEP2LKuRHxt5oEVZvq/EvwENS5T2BiVUSvTwXUS6SKCh
ERydjXE=
---- END SSH2 PUBLIC KEY ----

1023 37 76983149213904336854114697871156413897597333013960300274862161645944637611303244321149406756964434094764396730933825927553585120754675001147670015123442685209165940390638704889262818745065195784329243512386761389890962501775294435871155079992876425567019740053306097979712960040526841676998224241040015724649 rsa-key-20130520

解决方案

The key file looks OK. If you are giving the whole file to your method as a string then the method will try to encode the key which already is Base64 encoded.

You can create (and use) keys like this:

SecureRandom rand = new SecureRandom();
KeyPairGenerator gen = null;
try {
    gen = KeyPairGenerator.getInstance( "DSA" );
    }
catch ( NoSuchAlgorithmException e ) {
    System.err.println( e.getMessage());
}
gen.initialize ( 1024, rand );
KeyPair keys = gen.generateKeyPair ();

//----- Write keys into export files
PublicKey pubkey = keys.getPublic ();
writeKeyToFile ( pubkey, FILE_PUBLIC_KEY );
     System.out.println ( pubkey.toString ());
PrivateKey privkey = keys.getPrivate ();
writeKeyToFile ( privkey, FILE_PRIVATE_KEY );

这篇关于Java中,字符串转换为一个RSA公钥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆