- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建用 java 编写的消息签名和验证软件。
因此,我决定使用一些来自互联网的代码。
虽然代码没有语法错误,但显示java堆空间错误。
但是,错误消息如下所示
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)
at myPackage.BASE64Decoder.decodeAtom(BASE64Decoder.java:87)
at myPackage.CharacterDecoder.decodeBuffer(CharacterDecoder.java:61)
at myPackage.CharacterDecoder.decodeBuffer(CharacterDecoder.java:87)
at myPackage.UserSMSVerifier.messageGenarator(UserSMSVerifier.java:91)
at myPackage.Test1.main(Test1.java:8)
--Test1.java
package myPackage;
public class Test1{
public static void main(String[] args) throws Exception {
String testmessage = "kkkkkkkkkkkkkkk";
String contentMessage;
UserSMSVerifier.messageGenarator(testmessage);
}
}
--UserSMSVerifier.java
package myPackage;
import java.io.*;
import java.security.*;
import java.security.cert.*;
import javax.crypto.*;
import org.bouncycastle.openssl.*;
import org.bouncycastle.util.encoders.*;
//import android.os.*;
public class UserSMSVerifier {
static String signedMail;
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
public static String messageGenarator(String origninalMessage) throws Exception{
//load privateKey, Certificate
PEMReader userPrivateKey = new PEMReader(
new InputStreamReader(
new FileInputStream("C://Users//Lara//workspace_ee//TestCA_server//WebContent//"+"/pkcs10priv.key")));
PEMReader userCerti = new PEMReader(
new InputStreamReader(
new FileInputStream("C://Users//Lara//workspace_ee//TestCA_server//WebContent//"+"/userCert.cer")));
KeyPair userPrivate = (KeyPair)userPrivateKey.readObject();
X509Certificate userCert = (X509Certificate)userCerti.readObject();
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
//MessageDigest.
//java.security.MessageDigest
byte[] dataTosend = origninalMessage.getBytes();
//generate a SecretKey for Symmetric Encryption
SymmetricEncrypt encryptUtil = new SymmetricEncrypt();
SecretKey senderSecretKey = SymmetricEncrypt.getSecret();
//encrypt the data using a Symmetric Key
byte[] byteCipherText = encryptUtil.encryptData(dataTosend, senderSecretKey, "AES");
String strCipherText = new BASE64Encoder().encode(byteCipherText);
//get reciever's public key
PublicKey pubKeyReceiver = userCert.getPublicKey();
//encrypt the SecretKey with the Receivers public key
byte[] byteEncryptWithPublicKey = encryptUtil.encryptData(senderSecretKey.getEncoded(), pubKeyReceiver,"RSA/ECB/PKCS1Padding");
String strSenbyteEncryptWithPublicKey = new BASE64Encoder().encode(byteEncryptWithPublicKey);
md.update(dataTosend);
byte bytedataTosend[] = md.digest();
String stringDataTosend = new String();
for (int i=0; i < bytedataTosend.length;i++){
stringDataTosend = stringDataTosend + Integer.toHexString((int)bytedataTosend[i] & 0xFF); }
//Message to be Signed = Encrypted Secret Key + data
String strMsgToSign = strSenbyteEncryptWithPublicKey + "|" + stringDataTosend;
//sign the Messsage
//char[] password = "password".toCharArray();
Signature yourSign = Signature.getInstance("MD5withRSA");
yourSign.initSign(userPrivate.getPrivate());
yourSign.update(stringDataTosend.getBytes());
byte[] byteSignedData = yourSign.sign();
//yourSign.
//heoolo
//return new String(Hex.encode(byteSignedData));
//values transmitted through unsecure channels ==> byteSignedData, strMsgToSign
String strRecvSignedData = new String (byteSignedData);
String[] strRecvSignedDataArray = strMsgToSign.split("|");
int intindexofsep = strMsgToSign.indexOf("|");
String strEncryptWithPublicKey=strMsgToSign.substring(0, intindexofsep);
String strHashOfData = strMsgToSign.substring(intindexofsep+1);
//decrypt to get the symmetric key
byte[] bytestrEncryptWithPublicKey = new BASE64Decoder().decodeBuffer(strEncryptWithPublicKey);
byte[] byteDecryptWithPrivateKey = encryptUtil.decryptData(byteEncryptWithPublicKey , userPrivate.getPrivate(), "RSA/ECB/PKCS1Padding");
//decrypt the data using the Symmetric key
javax.crypto.spec.SecretKeySpec secretKeySpecDecrypted = new javax.crypto.spec.SecretKeySpec(byteDecryptWithPrivateKey, "AES");
byte[] byteDecryptText = encryptUtil.decryptData(byteCipherText, secretKeySpecDecrypted, "AES");
String strDecryptedText = new String(byteDecryptText);
System.out.println("Decrypted Data is : " + strDecryptedText);
return new String(Hex.encode(byteSignedData));
}
}
--BASE64Decoder.java
package myPackage;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.PrintStream;
public class BASE64Decoder extends CharacterDecoder {
protected int bytesPerAtom() {
return (4);
}
protected int bytesPerLine() {
return (72);
}
private final static char pem_array[] = {
// 0 1 2 3 4 5 6 7
'A','B','C','D','E','F','G','H', // 0
'I','J','K','L','M','N','O','P', // 1
'Q','R','S','T','U','V','W','X', // 2
'Y','Z','a','b','c','d','e','f', // 3
'g','h','i','j','k','l','m','n', // 4
'o','p','q','r','s','t','u','v', // 5
'w','x','y','z','0','1','2','3', // 6
'4','5','6','7','8','9','+','/' // 7
};
private final static byte pem_convert_array[] = new byte[256];
static {
for (int i = 0; i < 255; i++) {
pem_convert_array[i] = -1;
}
for (int i = 0; i < pem_array.length; i++) {
pem_convert_array[pem_array[i]] = (byte) i;
}
}
byte decode_buffer[] = new byte[4];
protected void decodeAtom(PushbackInputStream inStream, OutputStream outStream, int rem)
throws java.io.IOException
{
int i;
byte a = -1, b = -1, c = -1, d = -1;
if (rem < 2) {
//throw new Exception("BASE64Decoder: Not enough bytes for an atom.");
}
do {
i = inStream.read();
if (i == -1) {
//throw new Exception();
}
} while (i == '\n' || i == '\r');
decode_buffer[0] = (byte) i;
i = readFully(inStream, decode_buffer, 1, rem-1);
if (i == -1) {
//throw new Exception();
}
if (rem > 3 && decode_buffer[3] == '=') {
rem = 3;
}
if (rem > 2 && decode_buffer[2] == '=') {
rem = 2;
}
switch (rem) {
case 4:
d = pem_convert_array[decode_buffer[3] & 0xff];
// NOBREAK
case 3:
c = pem_convert_array[decode_buffer[2] & 0xff];
// NOBREAK
case 2:
b = pem_convert_array[decode_buffer[1] & 0xff];
a = pem_convert_array[decode_buffer[0] & 0xff];
break;
}
switch (rem) {
case 2:
outStream.write( (byte)(((a << 2) & 0xfc) | ((b >>> 4) & 3)) );
break;
case 3:
outStream.write( (byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)) );
outStream.write( (byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)) );
break;
case 4:
outStream.write( (byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)) );
outStream.write( (byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)) );
outStream.write( (byte) (((c << 6) & 0xc0) | (d & 0x3f)) );
break;
}
return;
}
}
最佳答案
将其放在您的运行时配置中:
Xss -1024m Xmx-1024m
更改 Java 堆参数。
关于java - 线程中出现异常 "main"java.lang.OutOfMemoryError : Java heap space with BASE64Decoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636459/
我正在分析一个显示一些奇怪的转储:命令 !heap -x -v hexadecimal_address 之间似乎存在矛盾。和 !heap -flt s size_of_block 我正在询问悬空指针。
我试图找到免费商店通常被称为堆的官方(或足够好的)原因。 除了它从数据段的末尾增长这一事实之外,我真的想不出一个很好的理由,尤其是因为它与堆数据结构几乎没有关系。 注意:很多人提到它只是一堆无组织的东
我发现了很多 MinMax Heap 实现,它们将数据存储在一个数组中。这真的很容易实现,这就是我正在寻找不同的东西的方式。我想创建一个 MinMax 堆,只使用堆的元素和指向左 child 和右 c
Ehcache talks about堆内和堆外内存。有什么不同?使用哪些 JVM 参数来配置它们? 最佳答案 堆上存储是指将出现在 Java 堆中的对象(并且也会受到 GC)。另一方面,堆外存储是指
多年来,我一直将 !heap –p –a 用于各种任务。 现在我开始使用最新的 Win8 sdk 中的 WinDbg 6.2.9200 在 Win8 上进行调试。 在这里,我发现 !heap –p –
我试图确定为什么我的应用程序消耗 4GB 的私有(private)字节。所以我做了一个完整的内存转储,将它加载到windbg中。但是使用 !heap -stat -h 进行分析产生不加起来的奇怪结果:
我正在分析 native 内存泄漏的转储,然后我观察到“锁争用”在 !heap –s 输出中。我不记得以前见过这个。这是什么意思? 最佳答案 这是堆管理器的锁争用。高锁争用通常是由大量并发分配请求引起
突然我的应用程序崩溃并弹出这个错误...知道这个错误吗?千辛万苦还是解决不了... 将目标 GC 堆从 111MB 钳制到 96MB Alloc 并发标记扫描 GC 释放了 3(96B) 个 Allo
我需要在应用程序运行时监控 JVM 空间,我使用 JMC 进行监控,但是当我停止 tomcat 时,JMC 不工作。 我的目标是我需要验证当应用程序关闭时所有堆内存(或某些部分)是否被释放以及它释放了
我有一个内存转储。在这个转储中,我有一个句柄为 fd00000 的堆。这是 !heap -s fd00000 命令输出的摘录: 0: Heap 0fd00000 Flags 00
我正在尝试返回一系列流媒体数字的运行中位数。为此,我使用最大堆(将值存储在序列的下半部分)和最小堆(将值存储在序列的上半部分)。 特别是我使用 heapq 模块 ( https://docs.pyth
我知道 Android 平台中有 Dalvik(JVM) 堆和 native 堆。而且 Dalvik GC 在 native 堆上没有工作。但我不确定这是如何工作的,我的意思是 Android 操作系
-Xms是指定初始堆大小还是最小堆大小?我看到不同的观点。有些人喜欢 second answer here ,说它用于初始堆,而其他一些人说它是最小堆大小。 还是说最小尺寸本身就是初始尺寸? 最佳答案
我正在编写一个将大量联系人与 Android 联系人数据库同步的程序。对于大约 700 个联系人,下载工作正常,之后我不断收到内存堆错误,该错误调用无限数量的 GC 语句并最终重新启动手机。我正面临
我正在使用 Apache Ignite ver2.7,使用 Config.xml 设置启动 Ignite 服务器。 ./ignite.sh $IGNITE_HOME/config/config.xml
在 Eclipse IDE 中执行 Web 驱动程序脚本时,出现 Unable to execute dex: Java heap space Java heap space 错误。我已经用 Andr
我有一个带有以下参数的 Java 应用程序,但即使总可用空间大于 45%(可以通过可视化 VM 看到),堆也不会被回收。 JVM 是否有任何理由不释放该堆空间?相同的设置在 Java6 中按预期工作。
我正在查看 ASP.NET 4 应用程序(工作流服务)的性能计数器 .NET CLR Memory -- # Bytes in all Heaps : 44,420,488 .NET CLR M
CentOS Linux 发行版 7.3.1611 gcc 版本 4.8.5 20150623 gperftool 2.4-8.el7 1.my c++ 程序链接 -ltcmalloc 在没有 HEA
我创建了一个Gradle包装器 $ gradle wrapper --gradle-version 5.0 --distribution-type all ...现在有 $ ./gradlew -ve
我是一名优秀的程序员,十分优秀!