Tag: 加密

使用KeyGenParameterSpec.Builder等效替换KeyPairGeneratorSpec – 密钥库操作失败

不推荐使用以下方法 KeyPairGenerator generator = KeyPairGenerator.getInstance(“RSA”, “AndroidKeyStore”); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this) .setAlias(alias) .setSubject(new X500Principal(“CN=Sample Name, O=Android Authority”)) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); generator.initialize(spec); 我遇到的替代品看起来像这样 KeyPairGenerator generator = KeyPairGenerator.getInstance(“RSA”, “AndroidKeyStore”); generator.initialize(new KeyGenParameterSpec.Builder (alias, KeyProperties.PURPOSE_SIGN) .setDigests(KeyProperties.DIGEST_SHA256) .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1) .build()); 虽然我能够使用它来生成密钥对条目并加密该值,但我无法解密它 public void encryptString(String alias) { try { KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null); RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); String initialText […]

RSA / ECB / OAEPWithSHA-256AndMGF1Padding但MGF1使用SHA-256?

我在Oracle的Java标准加密提供程序中找到了困难的方法 Cipher cipher = Cipher.getInstance(“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”); 使用与SHA-1相关的MFG1; SHA-256仅用于散列标签(实际上是空的)。 我发现在MFG1中实际使用SHA-256的唯一解决方案(通过答案和评论帮助)使用了另一种forms的Cipher.init : cipher.init(Cipher.DECRYPT_MODE, privKey, new OAEPParameterSpec( “SHA-256”, “MGF1″, MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT )); 问题: Cipher.getInstance是否会识别转换 ,效果类似于”RSA/ECB/OAEPWithSHA-256AndMGF1Padding” ,但MGF1使用SHA-256除外?

Adler32非常快速地重复

我正在使用adler32校验和算法从数据库ID生成一个数字。 因此,当我在数据库中插入一行时,我会获取该行的标识并使用它来创建校验和。 我遇到的问题是我刚刚在数据库中插入了207个后才生成重复校验和。 这比我预期的要快得多。 这是我的代码: String dbIdStr = Long.toString(dbId); byte[] bytes = dbIdStr.getBytes(); Checksum checksum = new Adler32(); checksum.update(bytes, 0, bytes.length); result = checksum.getValue(); 我正在做什么/怎么做有什么问题? 我应该使用不同的方法来创建唯一的字符串吗? 我这样做是因为我不想在URL中使用db id …对db结构的更改将破坏世界上的所有链接。 谢谢!

避免加密和编码的URL字符串中的换行符

我正在尝试实现一个简单的字符串编码器来混淆URL字符串的某些部分(以防止它们被用户弄乱)。 我使用的代码几乎与JCA指南中的示例完全相同,除了: 使用DES(假设它比AES快一点,并且需要更小的密钥)和 Base64 en /解码字符串以确保它对URL保持安全。 由于我无法理解的原因,输出字符串以换行符结束,我认为这不会起作用。 我无法弄清楚造成这种情况的原因。 关于类似的东西的建议更容易或指向其他一些资源阅读? 我发现所有的密码学参考都超过我的头脑(并且有点过分),但是简单的ROT13实现将无法工作,因为我想处理更大的字符集(并且不想浪费时间实现可能的东西)与我没想到的晦涩字符有问题)。 样本输入(无换行符): http://maps.google.com/maps?q=kansas&hl=en&sll=42.358431,-71.059773&sspn=0.415552,0.718918&hnear=Kansas&t=m&z=7 样本输出(换行符如下所示): GstikIiULcJSGEU2NWNTpyucSWUFENptYk4m5lD8RJl8l1CuspiuXiE9a07fUEAGM/tC7h0Vzus+ jAH6cT4Wtz2RUlBdGf8WtQxVDKZVOzKwi84eQh2kZT9T3KomlnPOu2owJ/2RAEvG+QuGem5UGw== 我的编码片段: final Key key = new SecretKeySpec(seed.getBytes(), “DES”); final Cipher c = Cipher.getInstance(“DES”); c.init(Cipher.ENCRYPT_MODE, key); final byte[] encVal = c.doFinal(s.getBytes()); return new BASE64Encoder().encode(encVal);

生成给定模数和指数的RSA密钥

我被要求使用给定的modulus和exponent值生成RSA密钥。 但我只想知道生成密钥而不指定模数和指数。 无论给出什么价值,似乎都是大整数值。 我在网上搜索了这个并找到了一些东西,但它无法通过成功。 所以,如果有人以前这样做了,他们可以给我一些提示吗? 这是我们尝试使用给定值的示例程序。 import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.RSAKeyGenParameterSpec; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; public class Sample { public static void main( String args[] ) { BigInteger modulus = new BigInteger(“350871044328208704010580786055405681”); BigInteger exponent = new BigInteger(“545161406957801571”); try { RSAPublicKeySpec […]

RSA私钥仅支持RSAPrivate(Crt)KeySpec和PKCS8EncodedKeySpec

我按照链接中的步骤操作: 如何读取.pem文件以获取私钥和​​公钥 。 我执行了以下三个命令: 1. $openssl genrsa -out mykey.pem 2048 2. $openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem -out private_key.pem -nocrypt 3. $ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der 这创建了三个文件,但是当我尝试通过Java代码读取这些文件时,我开始面临以下错误: PUBLIC KEY EXPO : 65537 Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys 我的代码供参考: public class PublicPrivateKeyDemo { private […]

我的CipherOutputStream无声地失败

我正在尝试使用公钥加密Java中的一些二进制数据,如此有用页面所述: http : //www.junkheap.net/content/public_key_encryption_java 根据页面的指示,我使用命令创建了公钥和私钥: openssl genrsa -aes256 -out private.pem 2048 openssl rsa -in private.pem -pubout -outform DER -out public.der 现在我用一个小程序保存加密一些数据: public class Rsa { public static void main(String[] args) throws Exception, IOException { File keyFile = new File(“public.der”); byte[] encodedKey = new byte[(int) keyFile.length()]; new FileInputStream(keyFile).read(encodedKey); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); KeyFactory kf = […]

如何将GCM身份validation标记放在密码流的末尾,在解密期间需要内部缓冲?

在Java中,“默认”AES / GCM提供程序SunJCE将在解密过程中内部缓冲1) 用作输入的加密字节或2) 作为结果产生的解密字节 。 执行解密的应用程序代码会注意到Cipher.update(byte[])返回一个空字节数组,而Cipher.update(ByteBuffer, ByteBuffer)返回写入长度为0.然后当进程完成时, Cipher.doFinal()将返回所有已解码的字节。 第一个问题是:哪个字节被缓冲,上面的数字1或数字2? 我假设缓冲仅在解密期间发生而不是加密,因为首先,在我的Java客户端执行从磁盘读取的文件的加密时,不会发生由此缓冲(稍后描述)引起的问题,它总是发生在服务器端,接收这些文件并进行解密。 其次,这里也是如此。 仅根据我自己的经验判断,我无法确定,因为我的客户端使用CipherOutputStream 。 客户端未明确使用Cipher实例上的方法。 因此,我无法推断是否使用了内部缓冲,因为我无法看到更新和最终方法返回的内容。 当我从客户端传输到服务器的加密文件变大时,我出现了真正的问题。 我的意思是超过100 MB。 接下来发生的是Cipher.update()抛出一个OutOfMemoryError 。 显然由于内部缓冲区的增长和增长。 此外,尽管内部缓冲并且没有从Cipher.update()接收到结果字节,但Cipher.getOutputSize(int)会不断报告不断增长的目标缓冲区长度。 因此,我的应用程序代码被迫分配一个不断增长的ByteBuffer ,它被提供给Cipher.update(ByteBuffer,ByteBuffer)。 如果我试图欺骗并传入容量较小的字节缓冲区,则update方法抛出一个ShortBufferException #1 。 知道我创建巨大的字节缓冲区是没有用的是非常令人沮丧。 鉴于内部缓冲是所有邪恶的根源,那么我在这里应用的明显解决方案是将文件分成块,每个1 MB – 我从来没有问题发送小文件,只有大文件。 但是,我很难理解为什么内部缓冲首先发生。 以前链接的SO答案说GCM:s认证标签是“在密文末尾添加的”,但它“不必放在最后”这种做法是“弄乱了GCM的在线性质”解密”。 为什么将标签放在最后只会扰乱服务器的解密工作? 这是我的推理方式。 要计算身份validation标记,或者MAC(如果愿意),客户端使用某种哈希函数。 显然, MessageDigest.update()不使用不断增长的内部缓冲区。 然后在接收端,服务器不能做同样的事情吗? 对于初学者来说,他可以解密字节,尽管是未经validation的字节,将这些字节提供给他的哈希算法的更新function,当标签到达时,完成摘要并validation客户端发送的MAC。 我不是一个加密的人,所以请跟我说话,好像我既愚蠢又疯狂,但又爱得足以照顾一些=)我全心全意地感谢你花时间阅读这个问题,甚至可能会有所启发! 更新#1 我不使用AD(关联数据)。 更新#2 编写了使用Java演示AES / GCM加密的软件,以及Java EE中的安全远程协议 (SRP)和二进制文件传输。 前端客户端使用JavaFX编写,可用于动态更改加密配置或使用块发送文件。 在文件传输结束时,会显示一些有关传输文件所用时间和服务器解密时间的统计信息。 该存储库还有一个文档,其中包含我自己的一些GCM和Java相关研究。 享受: […]

IDTECH信用卡读卡器数据解密

我正在尝试解密IDTECH信用卡读卡器的加密数据。 此详细信息已使用DU DES使用带有CBC密码的Triple DES加密。 加密刷卡(来自IDTECH信用卡读卡器): 028801001F372300%*5150********7903^PAYPASS/MASTERCARD^************ ***?*;5150********7903=***************?*8871B640F379F3BD8D057A13F81454 39B28D80BE8A43F3440D85928F576065EEE1BA54CAADFF67D552C2B0CBF1A9F 34B63402B967998FC7C80487C8A6DBFD46975985D3D7E865FEEF6A48930751DC9 71FDFCBC1989294B7EF6F0D0007AA731C31F574608EB85E57751DA48970F96B0E 8BECDB94D672D746C2CC75176FA6E0C9E6FEFE0B154A0959B6299490125000000 00197F6903 解密的可用细节:: Key Value: F5 BF 6B E8 55 AB 92 3A DE 7E 77 40 D8 46 F9 DE KSN: 62 99 49 01 25 00 00 00 00 1A 解密数据(结果):ASCII格式的数据 %B5150710200107903^PAYPASS/MASTERCARD^090910140000631??;5150710200 107903=090910140000631?0 任何安全算法或JAVA专家都可以指导我如何继续解密这些数据。 我在寻找java的解决方案。 以上信息是否足以解密数据或需要更多信息?

如何使用Java中的OID获取哈希算法名称?

我试图在Java中计算字节数组的哈希值。 要获取MessageDigest实例,我需要通知哈希名称,但我只有哈希OID。 是否有另一种方法可以执行此操作或从哈希OID到哈希名称的现有映射? String oid = “1.2.3.4.5”; String digestAlgorithmName = getDigestAlgorithmName(oid); MessageDigest messageDigest = MessageDigest.getInstance(digestAlgorithmName); byte[] actualHash = messageDigest.digest(new byte[] { 0x00 });