Tag: cryptography

CTR模式使用初始向量(IV)

据我所知,CTR模式不使用初始向量。 它只需要一个计数器,用给定的密钥对其进行加密,然后用明文对结果进行异或,以获得密文。 其他分组密码模式,如CBC,在进行加密之前,它们使用初始向量对明文进行异或。 所以这是我的问题。 我在Java中使用以下代码(使用bouncycastle库): Cipher cipher = Cipher.getInstance(“AES/CTR/PKCS5Padding”, “BC”); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(“Some plaintext”); 上述代码的每个不同调用使用相同的键给出不同的输出! 但是在做的时候: byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; Cipher cipher = Cipher.getInstance(“AES/CTR/PKCS5Padding”, “BC”); cipher.init(Cipher.ENCRYPT_MODE, key, IV); byte[] result = cipher.doFinal(“Some plaintext”); 我在上述代码的每次调用中都会得到相同的结果。 但为什么会这样呢? 我的意思是,CTR不需要IV,那么为什么当我不在每次通话中给出IV时我得到不同的结果,当我给出IV时它会返回相同的结果? […]

如何从pem文件加载公共证书?

我试图从下面的文件中提取RES公钥 —–BEGIN CERTIFICATE—– MIIGwTCCBamgAwIBAgIQDlV4zznmQiVeF45Ipc0k7DANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBDQS0zMB4XDTEyMTAzMDAwMDAwMFoXDTE1MTEwNDEyMDAwMFowgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVUZXhhczEQMA4GA1UEBxMHSG91c3RvbjEpMCcGA1UEChMgVmFsZXJ1cyBDb21wcmVzc2lvbiBTZXJ2aWNlcywgTFAxCzAJBgNVBAsTAklUMRkwFwYDVQQDDBAqLnZhbGVydXMtY28uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1GR2NKV9GwVHBtpvgBUdVVbd6qeh6aKOS/r5TIKFd3vFBGjC7cWYwF26F0YFvrAP262Yu+oDRTeuSKwyHmegD7aTSOyCTOva69WcnKYRmNfHsnnGRa5z4v9EKc1RbNcwIrDUz8zcdHdP6AO8JJgLreWyBl15WXdxAr3yNbwoyJTbWk2ToC64LASP+8SQQTRszg762FIbhZ8xda8KKGAyC29/FOcLIttoBANT4hEwvcRLKOxAA8tg322Dla1XU2gnxWP2dSuLEflGRcEovPjGqxCzuGe0aN8Lg7aKwgCR1OYXmGiKCNHupHkN7A+QrD8zrxKUFd1UiyLcIovYhadcdQIDAQABo4IDTDCCA0gwHwYDVR0jBBgwFoAUUOpzidsp+xCPnuUBINTeeZlIg/cwHQYDVR0OBBYEFKKX1d9m6kHUjxQ1OpzXgNRbNGR4MCsGA1UdEQQkMCKCECoudmFsZXJ1cy1jby5jb22CDnZhbGVydXMtY28uY29tMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATBhBgNVHR/wQCMAAwDQYJKoZIhvcNAQEFBQADggEBALdCoLlXX4Sg8pKcqlT8l1MHbS2rsnw03R8lVQBQqcJimE9VZqDdoLfEPASIEMQbl40T6RHb4tFuZNjP2y4Fy3jMAYf1yajZAtAd5OLOMU39cgZQY2J8QCeEVKt8qbH6P32/2yyuh4hcNL4Vz8G0MTzwVUjz8WVmUBHAQSpS0T9oDKkwvmrkPGJFVuBxCRDKYb/23O8EKKzSTiO37VbCaeFUrTuWc8tGP8XDqRdj2yefiVqcNp4xr2tq9ZhJcISWODqO4fzt6vPOwgdnY3fbPLeH2tZoZTSCPURAadoNOAIC6fCLFlHjLuRGkxWIHMX3QnrrVD8pC7FnDO09q/aADew= —–END CERTIFICATE—– 这是我做的代码.. public static PublicKey loadPublicKeyFromFile(File publicKeyFile) throws Exception { FileReader file = new FileReader(publicKeyFile); PemReader reader = new PemReader(file); X509EncodedKeySpec caKeySpec = new X509EncodedKeySpec(reader.readPemObject().getContent()); KeyFactory kf = KeyFactory.getInstance(“RSA”); PublicKey caKey = kf.generatePublic(caKeySpec); return caKey; } 但它抛弃了 java.security.InvalidKeyException: IOException: ObjectIdentifier() — data isn’t an object ID 从文件中提取RES公钥的适当方法是什么?

如何使用java PKCS#12密钥库中的证书来加密和解密文件?

任何人都可以解释如何使用存储在java’PKCS#12`密钥库中的证书加密和解密文件?

在Java中为AES生成随机IV

我正在为Android中的PBE实现和AES加密引擎,我发现了两种方法来实现IV的创建,我想知道哪个更好,更安全,以获得IvParameterSpec : 方法#1: SecureRandom randomSecureRandom = SecureRandom.getInstance(“SHA1PRNG”); byte[] iv = new byte[cipher.getBlockSize()]; randomSecureRandom.nextBytes(iv); IvParameterSpec ivParams = new IvParameterSpec(iv); 方法#2: AlgorithmParameters params = cipher.getParameters(); byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV(); ivParams = new IvParameterSpec(iv2);

Java Security&BouncyCastle API让人感到困惑和困惑

我一直在尝试理解用于Java的BouncyCastle加密API。 不幸的是,我发现Java加密通常被服务提供者接口和术语所掩盖,以至于我无法理解实际做的事情。 我已经尝试过反复阅读必要的文档,但它只是难以理解,引入了许多远远超出我认为应该需要的概念。 我真正想要的是一个执行以下操作的类: public class KeyPair { public byte[] public; public byte[] private; } public class RSACrypto { public static KeyPair generateRSAKeyPair() { /*implementation*/} public static byte[] encrypt(byte[] data, byte[] publicKey) { /*impl*/} public static byte[] decrypt(byte[] encryptedData, byte[] privateKey) { /*impl*/ } } 抱歉,如果这是一个非常复杂的问题,可以问为“我真正想要的一切”。 任何关于Java加密和BouncyCastle阅读内容的指针都非常受欢迎。 任何有关Java加密系统实际布局的概述都非常受欢迎。

使用PKCS#7加密

我正在使用Bouncy Castle提供的库来加密,解密,签名和validation签名。 我这样做 1.加密数据 2.签署数据 3.将带符号的字节写入文件 4.从文件中读取带符号的字节 5.validation签名 6.解密数据 我参考了Beginning Cryptography with Java 当我validation数据时,我的问题出在第5步 org.bouncycastle.cms.CMSException:message-digest属性值与计算值不匹配 我的代码如下 import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.cert.CertPathBuilder; import java.security.cert.CertStore; import java.security.cert.Certificate; import java.security.cert.CollectionCertStoreParameters; import java.security.cert.PKIXBuilderParameters; import java.security.cert.PKIXCertPathBuilderResult; import java.security.cert.TrustAnchor; import java.security.cert.X509CertSelector; import […]

解密(使用PHP)Java加密(PBEWithMD5AndDES)

有人让我用PHP解密一个用以下Java类加密的字符串。 public class CryptoLibrary { private Cipher encryptCipher; private sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); public CryptoLibrary() throws SecurityException{ java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE()); char[] pass = “NNSHHETJKKSNKH”.toCharArray(); byte[] salt = { (byte) 0xa3, (byte) 0x21, (byte) 0x24, (byte) 0x2c, (byte) 0xf2, (byte) 0xd2, (byte) 0x3e, (byte) 0x19 }; init(pass, salt, iterations); } public void init(char[] pass, byte[] salt, […]

使用RSA进行模乘会导致Java Card出错

你好我正在研究一个关于Java Card的项目,它暗示了很多模乘法。 我设法使用RSA密码系统在这个平台上实现模乘,但它似乎适用于某些数字。 public byte[] modMultiply(byte[] x, short xOffset, short xLength, byte[] y, short yOffset, short yLength, short tempOutoffset) { //copy x value to temporary rambuffer Util.arrayCopy(x, xOffset, tempBuffer, tempOutoffset, xLength); // copy the y value to match th size of rsa_object Util.arrayFillNonAtomic(eempromTempBuffer, (short)0, (byte) (Configuration.LENGTH_RSAOBJECT_MODULUS-1),(byte)0x00); Util.arrayCopy(y,yOffset,eempromTempBuffer,(short)(Configuration.LENGTH_RSAOBJECT_MODULUS – yLength),yLength); // x+y if (JBigInteger.add(x,xOffset,xLength, eempromTempBuffer, (short)0,Configuration.LENGTH_MODULUS)) […]

解密C#RIJNDAEL编码文本

我正在Java中实现与第三方应用程序的通信。 作为登录过程的一部分,第三方应用程序正在发送加密的字符串,我必须将其解码并发回。 我花了差不多2天googeling和阅读post,但我找不到正确的方法来实现这一点。 我有一个测试用例,其中加密的字符串是“c1W2YO1vYQzu6czteEidrG0U4g5gT4h57vAlP7tdjcY =”,用密码“GAT”解密必须返回“101714994”。 我所说的文档说明:授权字符串使用以下设置加密: 填充输入数据:PKCS * 7 密码字节数组长度为32个字节。 密码字符串转换为UTF-16编码的字节数组,然后用零填充字节数组,最长为32个字节。 更长的密码被截断。 这是如何解密授权字符串的C#示例: /// /// Decrypts a string. /// /// The string to decrypt. /// The password to use. /// The decrypted string. private static string DecryptString(string content, string password) { Rijndael aes; byte[] retVal = null; byte[] contentBytes; byte[] passwordBytes; byte[] ivBytes; try { […]

使用JAVA中的PKCS#7对数据进行签名

我想使用PKCS#7签署一个文本文件(可能是.exe文件或将来的其他文件)并使用Javavalidation签名。 我需要知道什么? 我在哪里可以找到API( .jar和文档)? 为了签署数据和validation数据,我需要遵循哪些步骤? 如果可能,请提供代码段。