【问题标题】:Converted SecretKey into bytes, how to convert it back to a SecretKey?将 SecretKey 转换为字节,如何将其转换回 SecretKey?
【发布时间】:2011-07-18 20:55:32
【问题描述】:

我使用以下代码将密钥转换为字节

SecretKey key = KeyGenerator.getInstance("DES").generateKey();
byte[] bkey=key.getEncoded();

现在我如何从bkey 获取密钥?我试过了:

SecretKeySpec secretkey = new SecretKeySpec(bkey,"DES");   
SecretKeyFactory sfkey = SecretKeyFactory.getInstance("DES");
SecretKey skey = sfkey.generateSecret(secretkey);

我收到以下错误:

Error during Exception java.security.spec.InvalidKeySpecException: Inappropriate key specification

【问题讨论】:

  • 为什么需要这样做?只需将 key 传递给您的密码即可。
  • @Bruno Ya 但我只是在学习 DES 的工作原理
  • @BrunoRohée:有些人只是希望他们的问题得到回答,而不是居高临下的精英回应。这样的评论让没有经验的用户不敢发表他们的问题;我会知道,因为我自己(现在仍然)处于那种情况......
  • @araisbec 这不是一个答案,而是一个评论,有些人确实很欣赏在他们的游荡将他们直接引向深渊时被提早阻止。在这个网站上,人们使用非常不安全的加密货币的例子比比皆是,因为没有人足够早地告诉他们。
  • @BrunoRohée,当您说明文时,我假设您正在谈论 PKCS 容器。以明文形式保存的密钥是否小于其以字节格式保存的大小?

标签: java security byte des


【解决方案1】:

这应该可以工作

    SecretKey key = KeyGenerator.getInstance("DES").generateKey();
    byte[] data = key.getEncoded();
    SecretKey key2 = new SecretKeySpec(data, 0, data.length, "DES");

【讨论】:

    【解决方案2】:

    试试这段代码...

    import javax.crypto.Cipher;
    import javax.crypto.BadPaddingException;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Key;
    import java.security.InvalidKeyException;
    
    public class DESede {
        private static String algorithm = "DESede";
        private static Key key = null;
        private static SecretKey secretKey = null;
        private static Cipher cipher = null;
        private static DESede obj = new DESede();
    
        private DESede() {
            try {
                key = KeyGenerator.getInstance(algorithm).generateKey();
                KeyGenerator.getInstance(algorithm).getProvider();
                byte[] keyBytes = key.getEncoded();
                String keyFormat = key.getFormat();
                String keyAlgorithm = key.getAlgorithm();
                String keyString = new String(keyBytes);
                System.out.println("Key Format::" + keyFormat);
                System.out.println("Key Algorithm::" + keyAlgorithm);
                System.out.println("Key String::" + keyString);
                keyString.getBytes();
                secretKey = new SecretKeySpec(keyBytes, 0, keyBytes.length, "DESede");
                byte[] secretKeyBytes = key.getEncoded();
                String secretKeyFormat = key.getFormat();
                String secretKeyAlgorithm = key.getAlgorithm();
                String secretKeyString = new String(secretKeyBytes);
                System.out.println("Secret Key Format::" + secretKeyFormat);
                System.out.println("Secret Key Algorithm::" + secretKeyAlgorithm);
                System.out.println("Secret Key String::" + secretKeyString);
                String keyNewString = "bXŒ*êÂÕê›æOÄ’Îý‘ãô|8¶Ë1­";
                byte[] keyNewBytes = keyString.getBytes();
                secretKey = new SecretKeySpec(keyBytes, 0, keyBytes.length, "DESede");
                cipher = Cipher.getInstance(algorithm);
            } catch (Exception e) {
            }
        }
    
        public static DESede getInstance() {
            return obj;
        }
    
        public static byte[] encrypt(String input) throws InvalidKeyException,
                BadPaddingException, IllegalBlockSizeException {
            System.out.println("Inside encrypt()");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] inputBytes = input.getBytes();
            System.out.println("Exit encrypt()");
            return cipher.doFinal(inputBytes);
        }
    
        public static String decrypt(byte[] encryptionBytes)
                throws InvalidKeyException, BadPaddingException,
                IllegalBlockSizeException {
            System.out.println("Inside decrypt()");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] recoveredBytes = cipher.doFinal(encryptionBytes);
            String recovered = new String(recoveredBytes);
            System.out.println("Exiting decrypt()");
            return recovered;
        }
    
        public static void main(String args[]) throws InvalidKeyException,
                BadPaddingException, IllegalBlockSizeException {
            byte[] encryptedValue = DESede.encrypt("plz try encrypt and decrypt me");
            System.out.println("encryptedValue::" + encryptedValue);
            String decryptedValue = DESede.decrypt(encryptedValue);
            System.out.println("decryptedValue::" + decryptedValue);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-14
      • 2015-07-21
      • 2018-08-20
      • 2013-01-08
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多