1

我正在尝试编写一个加密类,允许 iPhone 向 Android 发送加密文本,反之亦然。虽然这在 Android 中非常简单(以下代码)

    private static final String CIPHER_ALGORITHM = "AES";
private static final String RANDOM_GENERATOR_ALGORITHM = "SHA1PRNG";
private static final int RANDOM_KEY_SIZE = 128;

// Encrypts string and encode in Base64
public static String encrypt( String password, String data ) throws Exception 
{
    byte[] secretKey = generateKey( password.getBytes() );
    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 
{
    byte[] secretKey = generateKey( password.getBytes() );

    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 );
}

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();
}
}

我已经看到了几十个关于类似主题的答案,但没有得到一段真正有效的 iOS 代码,它给出了相同的结果。大多数代码甚至都无法正确编译。有人有一个真正的工作代码吗?

4

1 回答 1

2

请参阅iOS 上的RNCryptor和 Java 上的JNCryptor。它们实现相同的文件格式。它正确处理带有随机 IV 的 AES-CBC-256、带有随机盐的 PBKDF2 生成的密码,以及用于数据身份验证和完整性的经过验证的 HMAC。

于 2013-02-02T21:37:38.797 回答