Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 17位数字能否通过AES或其他算法加密为15位数字_Java_Algorithm_Encryption - Fatal编程技术网

Java 17位数字能否通过AES或其他算法加密为15位数字

Java 17位数字能否通过AES或其他算法加密为15位数字,java,algorithm,encryption,Java,Algorithm,Encryption,我使用AES加密一个17位数字,例如12345678901234567,然后我使用Base64对字节[]进行编码。最终结果字符串的长度为24。我想给它打条形码,24个字符太长了。一个由15个字符组成的字符串就好了,大约15个数字(例如123456789012345)就更好了 有什么方法可以达到我的目标吗 算法AES、DES、3DES。。?怎么做 我的DES加密算法 public static byte[] encrypt(byte[] datasource, String pa

我使用AES加密一个17位数字,例如12345678901234567,然后我使用Base64对字节[]进行编码。最终结果字符串的长度为24。我想给它打条形码,24个字符太长了。一个由15个字符组成的字符串就好了,大约15个数字(例如123456789012345)就更好了

有什么方法可以达到我的目标吗 算法AES、DES、3DES。。?怎么做

我的DES加密算法

        public static  byte[] encrypt(byte[] datasource, String password) {            
            try{
                    SecureRandom random = new SecureRandom();
                    DESKeySpec desKey = new DESKeySpec(password.getBytes());
                    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
                    SecretKey securekey = keyFactory.generateSecret(desKey);
                    Cipher cipher = Cipher.getInstance("DES");
                    cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
                    return cipher.doFinal(datasource);
            }catch(Throwable e){
                e.printStackTrace();
            }
            return null;
        }

        private static void longToByteArray(long l, byte[] b) {
            b[7] = (byte) (l);
            l >>>= 8;
            b[6] = (byte) (l);
            l >>>= 8;
            b[5] = (byte) (l);
            l >>>= 8;
            b[4] = (byte) (l);
            l >>>= 8;
            b[3] = (byte) (l);
            l >>>= 8;
            b[2] = (byte) (l);
            l >>>= 8;
            b[1] = (byte) (l);
            l >>>= 8;
            b[0] = (byte) (l);
        }



        long aliveTime = Long.parseLong("13664547854160806");
        byte[] longAsBytes = new byte[8];
        longToByteArray(aliveTime, longAsBytes);
        byte[] result = DES.encrypt(longAsBytes, password);
        String en = REncrypt.base64Encode(result);

加密算法不会压缩数据。事实上,如果有什么区别的话,加密数据将比原始数据更难压缩。加密算法执行的置乱将使加密数据中的任何冗余都难以提取

更好的方法是在加密之前压缩17位数字。在这种情况下,将十进制字符转换为二进制数可能比文本压缩算法提供更好的压缩。17位数字可容纳8个字节;i、 e.爪哇龙

下面是我要做的:

将十进制数字转换为长数字;i、 e.使用Long.parseLong或类似工具解析它。 将long拆分为8个字节,并将它们放入一个字节[]。 加密字节[]。结果应该是8个字节。 Base64对字节进行编码。 如果这样做,则加密的base64编码数字应少于15个字符

注意:我假设你的意思是加密;i、 e.您需要能够解密并恢复原始号码

更新

这可能不适用于许多/最合适的加密算法,因为它们通常具有过大的最小块大小。看见如果你读了这篇文章,你就会了解为什么会这样


您可能应该在这里回顾一下您真正想要实现的目标,并确定加密是否是实现这一目标的最佳方式。

什么是数字?我们如何知道哪种加密算法适合您?你没有提供足够的信息来帮助你@MarcusMüller我修改了我的问题,希望这次我说得更清楚一点你的问题没有意义。你不能从品脱罐里拿出一夸脱,也不能把一夸脱放进品脱罐里。无论是加密还是任何其他技术在这里都不起作用。您必须减小输入的大小,否则,如果将其哈希到15位,可能会发生冲突。@EJP 15位是不可能的,13个字符怎么样?请参阅Stephen C的解决方案。他的方法很棒。第三步的结果是16字节。我的代码怎么了?啊。。。您必须使用块大小为16字节的基于块的加密方案。阅读以下内容:+1以获取需求评审请求@罗恩:请试着在问题中阐明你的目标/要求。