java - 如何导出对称加密 key ?

标签 java encryption javax.crypto

我正在尝试在我的应用程序之间实现 javax.crypto 加密(通过 intnet)。我遵循这个(接受的答案):https://stackoverflow.com/questions/4319496/how-to-encrypt-and-decrypt-data-in-java问题是,据我了解,我需要在两个应用程序中拥有相同的 SecretKeySpec key 才能加密/解密数据。我不知道如何将其导出(作为字符串或其他内容),然后在我的两个应用程序中对其进行硬编码。

最佳答案

您可以使用 getEncoded() 方法导出 SecretKey。这会返回一个字节数组,您可以将其编码为字符串,例如使用 Base 64 编码。可以从此编码字节数组重新创建 SecretKeySpec 对象。

只是为了给您一个更好的想法,未经测试:

初始生成和导出

import org.apache.commons.codec.binary.Base64;

// "AES" is the key generation algorith, you might want to use a different one.
KeyGenerator kg = KeyGenerator.getInstance("AES"); 

// 256-bit key, you may want more or fewer bits.
kg.init(256);

SecretKey key = kg.generateKey();
byte[] keyBytes = key.getEncoded();

// Encode to a String, e.g. base 64 encoded
String encodedKey = new String(Base64.encodeBase64(keyBytes), "UTF-8");

导入/重新创建

// Base 64 decode
byte[] keyBytes = Base64.decodeBase64(encodedKey.getBytes("UTF-8"));

// Need to put the same key generation algorithm in here:
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

关于java - 如何导出对称加密 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20330494/

相关文章:

c++ - 如何使数组成为 C++ 中函数的参数?

javax.crypto.BadPaddingException : Given final block not properly padded

自 Android 6 Marshmallow 以来,javax.crypto.Cipher 的工作方式有所不同

java - 无法将 java.sql.Timestamp(yyyy-MM-dd HH :mm:ss. S) 正确格式化为字符串

java - 为什么mySQL数据库以小写字母保存字符串?

excel - Go - 是否可以加密 excel 工作簿

java - 解密加密流时出现 BadPaddingException

java - ObjectInputStream available() 方法未按预期工作 (Java)

java - Android - 更改方向时不使用横向布局

android - 使用 Android 进行 Realm 加密