2013-03-08 51 views
0

我是一个使用AES加密的新手。我需要在Android上加密一个字符串并将其发送给OpenBSD进行解密。 我可以使用OpenSSl和Android使用此代码对Openbsd进行加密/解密,但Android上的加密字符串与OpenBSD中的解密字符串不相等 任何人都可以帮助我。Android和Openbsd之间的AES

...
public class StringCryptor 
{ 
    private static final String CIPHER_ALGORITHM = "AES"; 
    private static final String RANDOM_GENERATOR_ALGORITHM = "SHA1PRNG"; 
    private static final int RANDOM_KEY_SIZE = 128; 
    // Private key already generated with generatekey() 
    static String PKEY= "15577737BBD910E794A6B3C250678DAF"; 
    // Convert PKEY to byte[] 
    static byte[] secretKey = toByte(PKEY); 

    // Encrypts string and encode in Base64 
    public static String encrypt(String password, String data) throws Exception 
    { 
     byte[] clear = data.getBytes(); 
     SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, CIPHER_ALGORITHM); 
     Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
     byte[] encrypted = cipher.doFinal(clear); 
     String encryptedString = Base64.encodeToString(encrypted, Base64.DEFAULT); 
     return encryptedString; 
    } 

    // Decrypts string encoded in Base64 
    public static String decrypt(String password, String encryptedData) throws Exception 
    { 
     SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, CIPHER_ALGORITHM); 
     Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
     cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); 
     byte[] encrypted = Base64.decode(encryptedData, Base64.DEFAULT); 
     byte[] decrypted = cipher.doFinal(encrypted); 
     return new String(decrypted); 
    } 


    // Convert String To Hexa 
    public static String toHex(byte[] buf) { 
     if (buf == null) 
      return "";  
     StringBuffer result = new StringBuffer(2*buf.length); 
     for (int i = 0; i < buf.length; i++) { 
      appendHex(result, buf[i]);  
     }   
     return result.toString(); 
    } 
    // Convert hex To byte 
    public static byte[] toByte(String hexString) { 
     int len = hexString.length()/2;  
     byte[] result = new byte[len];   
     for (int i = 0; i < len; i++)    
      result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue(); 
     return result; 
    } 

    private final static String HEX = "ABCDEF"; 
    private static void appendHex(StringBuffer sb, byte b) { 
     sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); 
    } 

//public static byte[] generateKey(byte[] seed) throws Exception 
    //{ 
    //KeyGenerator keyGenerator = KeyGenerator.getInstance(CIPHER_ALGORITHM); 
     //SecureRandom secureRandom = SecureRandom.getInstance(RANDOM_GENERATOR_ALGORITHM); 
     //secureRandom.setSeed(seed); 
     //keyGenerator.init(RANDOM_KEY_SIZE, secureRandom); 
     //SecretKey secretKey = keyGenerator.generateKey(); 
     //return secretKey.getEncoded(); 
    //} 
} 
...

与Android

Bonjour >>>>>>> NkrWPLgiY0rt34iaNzhjOg== 

在OpenBSD中生成的加密字符串,我crypting用私钥android系统生成的字符串

#openssl version 
openSSl 0.9.8k 25 Mar 2009 
#echo "Bonjour">test.txt 
#openssl enc -aes1278 -a -in text.txt -K 15577737BBD910E794A6B3C250678DAF -iv 0 
4UwyKgMGJ41xPwTph2qHXQ== 
+0

你有同样的钥匙吗? – DjHacktorReborn 2013-03-08 17:38:23

回答

1

我花时间测试你的代码,问题很简单。如果你这样做echo "Bonjour" > test.txt“换行”会自动添加到Bonjour

因此,在Java中,您加密字符串"Bonjour",但openssl读取的text.txt文件包含字符串"Bonjour\n"。您可以通过将-n标志添加到echo来更改该标志。现在的OpenSSL应打印一样的Java:

$ echo -n "Bonjour" > test.txt 
$ openssl enc -aes128 -a -in test.txt -K 15577737BBD910E794A6B3C250678DAF -iv 0 
NkrWPLgiY0rt34iaNzhjOg== 

显然,我的发言是由随机生成的Java的IV是错误的。

+0

非常感谢。 – OMH 2013-03-09 08:19:53

+0

不错的catch vstm;) – ramrunner 2013-03-09 13:07:26