首页 新闻 会员 周边

请教python的aes加密问题

0
[已解决问题] 解决于 2018-10-27 21:39

python实现下面这段java的aes加密,总是和java 的结果不一样
感觉原因是java 里对加密内容没要求,而python的pycryptodemo模块 加密内容要是16的倍数,不足要补足才行,不知道咋玩了,有没有同时懂java和python的 帮我看看

package com.ussd.util; 
import java.security.Key; 
import java.util.Arrays; 
import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 
import org.apache.commons.codec.binary.Base64; 
public class AesEcbUtils { 
         // 算法名称 
         private final static String KEY_ALGORITHM = "AES"; 
         // 字符集 
         final static String CHARSET_NAME = "UTF-8"; 
         private static Key getKey(byte[] keyBytes) { 
                 // 如果密钥不足 16 位,那么就补足 
                 int base = 16; 
                 if ((keyBytes.length % base) != 0) { 
                         int groups = (keyBytes.length / base) + ((keyBytes.length % base) != 0 ? 1 : 0); 
                         byte[] temp = new byte[groups * base]; 
                         Arrays.fill(temp, (byte) 0); 
                         System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length); 
                         keyBytes = temp; 
                 } 
                 // 转化成 JAVA 的密钥格式 
                 return new SecretKeySpec(keyBytes, KEY_ALGORITHM); 
         } 
  
         /*
         * 加密方法 

        * 
         * @param content 要加密的字符串 
         * @param key 加密密钥 
         * @return 
         */ 
         public static String encrypt(String content, String key) throws Exception{ 
                 try { 
                         byte[] enc = encrypt(content.getBytes(CHARSET_NAME), key.getBytes(CHARSET_NAME)); 
                         String base64Str = Base64.encodeBase64String(enc); 
                         return new String(base64Str.getBytes(), CHARSET_NAME); 
                 } 

                 catch (Exception e) { 
                         throw e; 
                 } 
         }   
         /** 
         * 加密方法 
         * 
         * @param content 要加密的字符串 
         * @param keyBytes 加密密钥 
         * @return 
         * @throws Exception 
         */ 
         private static byte[] encrypt(byte[] content, byte[] keyBytes) throws Exception { 
               byte[] encryptedText = null;
                 try { 
                         Key key = getKey(keyBytes); 
                         Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); 
                         cipher.init(Cipher.ENCRYPT_MODE, key); 
                         encryptedText = cipher.doFinal(content); 
                 } 
                 catch (Exception e) { 
                         throw e; 
                 } 
                 return encryptedText; 
         } 

         /** 
         * 解密方法 
         * 
         * @param encryptedData 要解密的字符串 
         * @param key 解密密钥 
         * @return 
         * @throws Exception 
         */ 
         public static String decrypt(String encryptedData, String key) throws Exception { 
                 try { 
                         byte[] enc = encryptedData.getBytes(CHARSET_NAME); 
                         enc = Base64.decodeBase64(enc); 

                        byte[] dec = decrypt(enc, key.getBytes(CHARSET_NAME)); 
                         return new String(dec, CHARSET_NAME); 
                 } 
                 catch (Exception e) { 
                         throw e; 
                 } 
         } 
  
         /** 
         * 解密方法 
         * 
         * @param encryptedData 要解密的字符串 
         * @param keyBytes 解密密钥 
         * @return 
       * @throws Exception 
         */ 
         private static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) throws Exception { 
                 byte[] encryptedText = null;
                 try { 
                         Key key = getKey(keyBytes); 
                         Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); 
                         cipher.init(Cipher.DECRYPT_MODE, key); 
                         encryptedText = cipher.doFinal(encryptedData); 
                 } 
                 catch (Exception e) { 
                         throw e; 
                 } 
                 return encryptedText; 

         } 
          
         public static void main(String[] args) throws Exception { 
                 // 加解密 密钥 
                 String key = "hg62159393"; // 此为密钥 
                 String content = "aaaaaa"; 
                 // 加密字符串 
                 System.out.println("加密前的内容:" + content); 
                 System.out.println("加密密钥:" + key); 
                 // 加密方法 
                 String enc = AesEcbUtils.encrypt(content, key); 
                 System.out.println("加密后的内容:" + enc); 
                 // 解密方法 

                  enc = AesEcbUtils.decrypt(enc, key); 
                 System.out.println("解密后的内容:" + enc); 
         } 
} 

 
MrG的主页 MrG | 菜鸟二级 | 园豆:208
提问于:2018-10-23 08:26
< >
分享
最佳答案
0

我看代码并不是要求加密内容必须是16的倍数,而是密钥长度吧。你用python写的话,保持和java一直的算法也不行吗(不足16补充一样的字节)

奖励园豆:5
会长 | 专家六级 |园豆:12401 | 2018-10-23 10:09

我的问题是java没有要求,python的那个加密方法要求加密内容也要16的倍数,这样与java不一样,

MrG | 园豆:208 (菜鸟二级) | 2018-10-23 10:57

@MrG: 我看你贴的java代码了,不是java没要求,是java已经把补齐的操作封装起来了,而python没有,把决定权留给了调用者。

会长 | 园豆:12401 (专家六级) | 2018-10-23 11:42

@MrG: 你是说不仅是密钥,加密对象也要是16的倍数?

会长 | 园豆:12401 (专家六级) | 2018-10-23 11:43

看看这个能通用不:https://www.jianshu.com/p/261b36ac31db

会长 | 园豆:12401 (专家六级) | 2018-10-23 11:50

@会长: 不行 第24行也是对加密内容做了手脚,java里没有这个步骤,不知道为啥python的aes总是要加密内容是16的倍数

MrG | 园豆:208 (菜鸟二级) | 2018-10-23 12:21

@MrG: 那吧java代码改成和python一样的算法行吗

会长 | 园豆:12401 (专家六级) | 2018-10-23 13:43

不行。。。我要让python和JAVA一样

MrG | 园豆:208 (菜鸟二级) | 2018-10-23 19:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册