- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将此 KeeLoq 算法从 C 语言转换为 Java,但我的解密方法似乎对 Java 的 BigInteger 使用了太多内存。我想知道是否存在适用于 Java 的 BigInteger 的等效操作。
index 和 bitVal 变量的原始计算在下面注释掉了。
我用作示例的原始源代码可以在这里找到: https://github.com/franksmicro/Arduino/blob/master/libraries/Keeloq/Keeloq.cpp
如有任何帮助,我们将不胜感激。
package keeloq;
/**
*
* @author
*/
import java.math.BigInteger;
public class KeeLoq {
BigInteger _keyHigh, _keyLow, keyHigh, keyLow;
int KeeLoq_code = 0x3A5C742E;
BigInteger KeeLoq_NLF = new BigInteger(Integer.toString(KeeLoq_code));
public KeeLoq() {
}
public KeeLoq(BigInteger keyHigh, BigInteger keyLow) {
_keyHigh = keyHigh;
_keyLow = keyLow;
}
public BigInteger bitRead(BigInteger x, int n) {
BigInteger temp = x.shiftRight(n);
return temp;
}
public BigInteger multiplyBig(BigInteger x, BigInteger n) {
BigInteger temp = x.multiply(n);
return temp;
}
public BigInteger Encrypt(BigInteger data) {
BigInteger x = data;
int keyBitNo;
long index;
long position1, position2, position3, position4, position5;
BigInteger keyBitVal, bitVal;
BigInteger b1, b2, b3, b4, b5;
for (int r = 0; r < 528; r++) {
keyBitNo = r & 63;
if (keyBitNo < 32) {
keyBitVal = bitRead(_keyLow, keyBitNo);
} else {
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
}
position1 = bitRead(x, 1).longValue() * 1;
position2 = bitRead(x, 9).longValue() * 2;
position3 = bitRead(x, 20).longValue() * 4;
position4 = bitRead(x, 26).longValue() * 8;
position5 = bitRead(x, 31).longValue() * 16;
index = position1 + position2 + position3 + position4 + position5;
System.out.println("the encrypted index is " + index);
b1 = bitRead(x, 0);
b2 = bitRead(x, 16);
int intIndex = (int) index;
b3 = bitRead(KeeLoq_NLF, intIndex);
b4 = keyBitVal;
bitVal = b1.xor(b2).xor(b3).xor(b4);
BigInteger tempx = x.shiftRight(1);
x = tempx.xor(bitVal);
//bitVal = bitRead(x,0) ^ bitRead(x, 16) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
//x = (x>>1) ^ bitVal<<31;
}
return x;
}
BigInteger Decrypt(BigInteger data) {
BigInteger x = data;
int keyBitNo;
long index;
long position1, position2, position3, position4, position5;
BigInteger keyBitVal, bitVal;
BigInteger b1, b2, b3, b4, b5;
for (int r = 0; r < 528; r++) {
keyBitNo = (15 - r) & 63;
if (keyBitNo < 32) {
keyBitVal = bitRead(_keyLow, keyBitNo);
} else {
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
}
position1 = bitRead(x, 0).longValue() * 1;
position2 = bitRead(x, 8).longValue() * 2;
position3 = bitRead(x, 19).longValue() * 4;
position4 = bitRead(x, 25).longValue() * 8;
position5 = bitRead(x, 30).longValue() * 16;
index = position1 + position2 + position3 + position4 + position5;
System.out.println("The Decrypted index is " + index);
b1 = bitRead(x, 31);
b2 = bitRead(x, 15);
int intIndex = (int) index;
b3 = bitRead(KeeLoq_NLF, intIndex);
b4 = keyBitVal;
bitVal = b1.xor(b2).xor(b3).xor(b4);
BigInteger tempx = x.shiftLeft(1);
x = tempx.xor(bitVal);
//index = 1 * bitRead(x,0) + 2 * bitRead(x,8) + 4 * bitRead(x,19) + 8 * bitRead(x,25) + 16 * bitRead(x,30);
// bitVal = bitRead(x,31) ^ bitRead(x, 15) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
// x = (x<<1) ^ bitVal;
}
return x;
}
public static void main(String[] args) {
BigInteger highKey = new BigInteger(Integer.toString(66));
BigInteger lowKey = new BigInteger(Integer.toString(35));
KeeLoq KeeLoq_file = new KeeLoq(highKey, lowKey);
System.out.println("The KeeLoq Code is " + KeeLoq_file.KeeLoq_code);
BigInteger EncryptedBigInt = KeeLoq_file.Encrypt(KeeLoq_file.KeeLoq_NLF);
System.out.println("The Encrypted BigIntegerValue is " + EncryptedBigInt);
System.out.println("The Encrypted integer value is " + EncryptedBigInt.intValue());
BigInteger DecryptedBigInt = KeeLoq_file.Decrypt(EncryptedBigInt);
System.out.println("The Decrypted BigIntegerValue is " + DecryptedBigInt);
System.out.println("The Decrypted integer value is " + DecryptedBigInt.intValue());
}
}
最佳答案
编辑:我想我明白了! (或至少其中的一部分)
问题至少部分在这一行:(一开始弄错了行,抱歉)
int intIndex = (int) index;
当 index
足够大时,(int) index
将溢出到一个很大的负值。猜猜当您将其传递给 bitRead()
时会发生什么?
现在,为什么这个溢出发生在 Decrypt()
中而不是 Encrypt()
中,我不确定......我会在稍后查看再休息一下,但希望这是一个开始。
您可以通过使用 -Xmx 标志运行程序来增加可用内存空间。例如,要使用最大 4 GB 的内存运行,您将使用 -Xmx4G
在 Eclipse 中,这可以通过右键单击文件进行设置,转到属性 --> 运行/调试设置 --> 单击启动配置 --> 编辑 --> 参数选项卡 --> VM 参数--> 输入标志。
如果您使用 Java 的 BigInteger
类内存不足,我不确定使用任何其他任意精度库是否可以让您在数字实际变得那么大的情况下走得很远。
关于Java BigInteger 内存不足,可能来自长转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23402672/
所以我正在为考试复习,并在 SQL 河(或荒地)中撞到了一块大石头 我制作了以下表格并插入了以下数据: create table Permissions ( fileName VARCHAR(
我有一个使用 maxWidth 定义的 jqueryui 对话框。 $("#myDialog").dialog({ autoOpen: false, width: 'a
注意:我遗漏了不相关的代码 所以我目前正在研究 CCC 1996 P1,这个问题的全部目的是能够计算一个整数输入是完美数、不足数还是充数。我上面列出的代码可以工作,但是我认为它太慢了。该代码会迭代每个
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在使用 Go 和 Redis 开发 API。问题是RAM使用不足,我找不到问题的根源。 TL;DR 版本 有数百/数千个哈希对象。每个 1 KB 的对象(键+值)占用大约 0.5 MB 的 RAM
在我的 GCE Kubernetes 集群上,我无法再创建 pod。 Warning FailedScheduling pod (www.caveconditions.com-f1be467e3
当我尝试在EKS Fargate群集上安装指标服务器时,它抛出错误: 0/4 nodes are available: 4 Insufficient pods. 按照以下说明从此处安装指标服务器:ht
遍布this document Apple 提到 iOS 在某些情况下会终止应用程序,最常见的原因似乎是释放一些 RAM。这会导致未实现状态恢复的应用程序出现问题——用户正在处理和暂时离开的一些内容可
尝试处理一个10分钟的音频文件时出现以下错误。我刚刚开始使用Google Cloud产品,所以我是唯一访问此资源的人。我怎么可能超出配额?配额设置为其默认值,我认为我没有任何限制。还有其他原因吗? 我
R 语言让我感到困惑。实体有模式和类,但即使这样也不足以完全描述实体。 这个answer说 In R every 'object' has a mode and a class. 所以我做了这些实验:
我在 west-1 有一个 Openshift v3 项目。在其中,我有一个运行良好的应用程序,但在 GitHub 提交代码中非常下游的内容后,该应用程序停止工作。问题在于制作 pod: No nod
我在 west-1 有一个 Openshift v3 项目。在其中,我有一个运行良好的应用程序,但在 GitHub 提交代码中非常下游的内容后,该应用程序停止工作。问题在于制作 pod: No nod
在 how-do-i-access-the-stackoverflow-api-from-mathematica我概述了如何使用 SO API 让 Mathematica 制作一些有趣的顶级回答者声誉
所以在 GKE 上,我有一个 Node.js app,每个 pod 使用大约:CPU(cores): 5m, MEMORY: 100Mi 但是我只能为每个 Node 部署 1 个 pod。我使用的是
我正在使用 async.eachOfSeries 超过 300 个数组并请求一些 GA api,它工作正常但有时我会收到错误.. UnhandledPromiseRejectionWarning:错误
我正在尝试在 AWS ec2 上托管的 kubernetes 集群上使用 mr3 设置配置单元。当我运行命令 run-hive.sh 时,Hive 服务器启动,并且 master-DAg 被初始化,但
创建订阅时有时会出现以下错误: Insufficient tokens for quota 'administrator' and limit 'CLIENT_PROJECT-100s' of ser
我是一名优秀的程序员,十分优秀!