gpt4 book ai didi

java - 黑莓中使用 NoPadding 进行 AES 加密

转载 作者:行者123 更新时间:2023-12-01 23:34:57 26 4
gpt4 key购买 nike

我是黑莓开发新手,需要使用 AES/ECB/NoPadding 完成加密和解密任务。我使用了下面的代码,来自互联网。

加密方式:

public static byte[] encrypt( byte[] keyData,String message )
throws Exception
{


byte[] data = message.getBytes("UTF-8");

// Create the AES key to use for encrypting the data.
// This will create an AES key using as much of the keyData
// as possible.


if ((data.length % 16) != 0 ) {
StringBuffer buffer = new StringBuffer(message);
int moduleOut = data.length % 16;
int padding = 16 - moduleOut;
for(int i = 0 ; i < padding; i++){
buffer.append(" ");
}
data = buffer.toString().getBytes("UTF-8");
}

AESKey key = new AESKey( keyData);

NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream(data.length);
AESEncryptorEngine engine = new AESEncryptorEngine(key);
BlockEncryptor encryptor = new BlockEncryptor(engine, out);


encryptor.write(data,0,data.length);
int finalLength = out.size();
byte[] cbytes = new byte[finalLength];
System.arraycopy(out.toByteArray(), 0, cbytes, 0, finalLength);
// encryptor.close();
// out.close();
return cbytes;

}

解密方法:

    public static byte[] decrypt(byte[] keyData, byte[] base64EncodedData)
throws CryptoException, IOException
{

// String base64EncodedData=new String(base64EncodedData);

byte[] cipherText =Base64ToBytes(new String(base64EncodedData));
// First, create the AESKey again.
AESKey key = new AESKey(keyData);

// Now, create the decryptor engine.
AESDecryptorEngine engine = new AESDecryptorEngine(key);

// Create the BlockDecryptor to hide the decryption details away.
ByteArrayInputStream input = new ByteArrayInputStream(cipherText);
BlockDecryptor decryptor = new BlockDecryptor(engine, input);

// Now, read in the data.
byte[] temp = new byte[100];
DataBuffer buffer = new DataBuffer();

for (;;)
{
int bytesRead = decryptor.read(temp);
buffer.write(temp, 0, bytesRead);

if (bytesRead < 100)
{
// We ran out of data.
break;
}
}

byte[] plaintext = buffer.getArray();
return plaintext;

}

Base64 到 Bytes 转换方法:

private static byte[] Base64ToBytes(String code) {

byte[] aesString = null;
try
{
aesString = Base64InputStream.decode(code);
}
catch (IOException ioe)
{
}
return aesString;
}

现在的问题是,当我用上面的方法加密我的字符串时,我在字符串末尾得到了填充的unicodes,这在服务器端是不能容忍的。

我知道这是由于 PKCS5FormatterEngine 造成的,并且在使用此类时通常会在字符串末尾附加字符。

但是如果我想使用 AES/ECB 方法以及 NoPadding 加密和解密字符串怎么办?我知道 ECB 不是一种安全模式,但服务器使用 PHP 并准备就绪,在 Android 和 J2ME 中运行良好。

请指导。如何绕过 PKCS5FormatterEngine 或在没有任何填充的情况下进行加密。

更新:

我尝试在 Blackberry 中使用 Cipher 类,就像在 Android 和 J2ME 中使用的那样,但它似乎在 net_rim_api.jar 中不可用,即使我尝试下载 bouncy caSTLe jar 文件和依赖类 NoSuchAlogrithmException 所以 java.security jar (org.osgi.foundation -1.0.0.jar),编译,但是当我尝试运行时,它停止说找到重复的类。它有一个问题,我为 java.security 保留的 jar 中很少有重复的类。

如果您有解决方案,请告诉我。

更新答案:我已使用完整的加密和解密代码更新了我的代码,并检查了答案以更好地理解。

最佳答案

不确定这确实是一个普遍的答案,但在这个特定的情况下可能会有所帮助,所以我这样添加它。

如果没有一些填充,您就无法真正使用 AES,因为 AES 处理不希望假设您提供的数据将是 16 字节的倍数。但是,如果您实际上始终提供 16 字节倍数的缓冲区,那么您可以使用如下代码加密数据:

        AESEncryptorEngine engine = new AESEncryptorEngine( key );
for ( int j = 0; j < ciphertext.length - 15; ) {
engine.encrypt(plainText, j, ciphertext, j);
j = j+16;
}

那么你如何确保这在另一端正常工作呢?可能会也可能不会这样做 - 这实际上取决于正在传输的内容。

但是,例如,如果您传递 XML 数据,那么您可以附加空格以使数据达到 16 字节边界,这些空格将被服务器解密为空格,然后被解析忽略。您可以向各种文件格式添加冗余填充字节,并且填充将被忽略,这完全取决于正在处理的文件格式。

更新

鉴于实际数据是 JSON,并且我相信 JSON 会忽略尾随空格,我采取的方法是在加密之前将空格附加到 JSON 数据。

因此将 JSON 字符串转换为字节:

byte [] jsonBytes = jsonString.getBytes("UTF-8");

如果您也需要,请填充此:

if ( (jsonBytes.length % 16) != 0 ) {
// Now pad this with spaces
}

并且您可以加密结果,而不必担心填充字节。

关于java - 黑莓中使用 NoPadding 进行 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18843783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com