package aesclient;
import java.io.OutputStream;
import java.net.Socket;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESClient {
static byte[] plaintext = new byte[] {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53};
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 1337); // connecting to server on localhost
OutputStream outputStream = socket.getOutputStream();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
String s_key = "Random09" + "Random09"; // 16 Byte = 128 Bit Key
byte[] b_key = s_key.getBytes();
SecretKeySpec sKeySpec = new SecretKeySpec(b_key, "AES");
SecureRandom random = SecureRandom.getInstanceStrong();
byte[] IV = new byte[16]; // initialization vector
int num = 10000;
long start = System.nanoTime();
for (int i = 0; i < num; ++i) {
random.nextBytes(IV);
IvParameterSpec ivSpec = new IvParameterSpec(IV);
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, ivSpec);
byte[] msg = new byte[16 + 32];
System.arraycopy(IV, 0, msg, 0, IV.length);
byte[] encrypted = cipher.doFinal(plaintext);
System.arraycopy(encrypted, 0, msg, IV.length, encrypted.length);
outputStream.write(msg);
outputStream.flush();
}
long end = System.nanoTime();
long duration = end - start;
double drate = ((double)plaintext.length*(double)num)/((double)duration/1000000000);
System.out.println("Verschlüsselung:\n" + num + " mal 19 Bytes in " + ((double)duration/1000000000) + " s\nData Rate = " + drate/1000.0 + " kBytes/s");
}
catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
我在想为什么它非常慢。我得到如下输出:
Verschlüsselung:
10000 mal 19 Bytes in 2.566016627 s
Data Rate = 74.04472675694785 kBytes/s
这意味着原始(未加密)数据的数据速率为74Kbyte/s。如果省略通过TCP发送,数据速率只会微乎其微地增加(大约为100Kbyte/s)。我读过大约20Mbyte/s甚至更高的数据速率。我有一台装有Windows10和i5处理器的笔记本电脑。如果有任何帮助,我将不胜感激。正如我所说,我只需要传输大量加密的小数据包(19字节)。
securerandom
即使在PRNG模式下也很慢,甚至在熵不足时会阻塞。
我建议将随机IV源一次,并在迭代之间增加它,类似于CTR模式。或者只是使用CTR模式。
public class Test {
static byte[] plaintext = new byte[] { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
0x52, 0x53 };
public static void main(String[] args) {
try {
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
String s_key = "Random09" + "Random09"; // 16 Byte = 128 Bit Key
byte[] b_key = s_key.getBytes();
SecretKeySpec sKeySpec = new SecretKeySpec(b_key, "AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] IV = new byte[16]; // initialization vector
random.nextBytes(IV);
int num = 10000;
long start = System.nanoTime();
for (int i = 0; i < num; ++i) {
IvParameterSpec ivSpec = new IvParameterSpec(IV);
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, ivSpec);
byte[] msg = new byte[16 + 32];
System.arraycopy(IV, 0, msg, 0, IV.length);
byte[] encrypted = cipher.doFinal(plaintext);
System.arraycopy(encrypted, 0, msg, IV.length, encrypted.length);
increment(IV);
}
long end = System.nanoTime();
long duration = end - start;
double drate = ((double) plaintext.length * (double) num) / ((double) duration / 1000000000);
System.out.println("Verschlüsselung:\n" + num + " mal 19 Bytes in " + ((double) duration / 1000000000) + " s\nData Rate = " + drate
/ 1000.0 + " kBytes/s");
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
private static void increment(byte[] iv) {
for (int i=0; i<4; ++i) {
if (++iv[i] != 0)
break;
}
}
}
印花:
Verschlüsselung:
10000 mal 19 Bytes in 0.0331898 s
Data Rate = 5724.650344382912 kBytes/s
本文向大家介绍java实现的AES加密算法完整实例,包括了java实现的AES加密算法完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的AES加密算法。分享给大家供大家参考,具体如下: PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 密码安全性在线检测: http://tools.jb51.net/password/my_password_safe 高强度密码生
几天来,我一直试图用java解密一个用OpenSSL加密的消息。使用以下命令对邮件进行了加密: openssl enc-e-aes-256-cbc-kfile$file.key-in toto-out toto.enc。 文件file.key包含256位的对称密钥。命令中没有指定salt,但文件以salted__开头。下面是我编写的类,试图解密文件,但即使删除文件的16个字符也无法得到任何东西,即
我试图在java中实现crypto js中的以下代码以进行加密 以下是我的实现(AES/CBC/PKCS7Padding): GenerateIV(int, int, int, byte[], byte[], MessageDigest)的实现: 这个方法相当于OpenSSL的EVP_BytesToKey函数,正如我在cryptojs源代码(cryptojs)中看到的那样-js@4.1.1在文件密
本文向大家介绍Java AES加密解密的简单实现方法,包括了Java AES加密解密的简单实现方法的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接上代码 以上这篇Java AES加密解密的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
我有一个Python应用程序和PHP网站,通过一些特定的网络层发送消息进行通信。我的任务是使用该通道发送所有AES加密和Base64编码的消息。加密密钥是为双方手动预共享的。 在PHP中,我使用以下代码创建名为的最终消息文本: 我在我的Python应用程序中收到这样的消息,去掉了魔力,得到了base64字节的数据。我找不到一个示例来使兼容的AES密码来解码此消息的问题。 Key和“Magic”只是