Tag: 加密

使用Java进行SHA2密码存储

我正在尝试进行XML-RPC调用,该调用需要对特定字符串进行HmacSHA-256哈希处理。 我目前正在使用带有以下代码的Jasypt库: StandardPBEStringEncryptor sha256 = new StandardPBEStringEncryptor(); sha256.setPassword(key); sha256.setAlgorithm(“PBEWithHmacSHA2”); 在尝试使用sha256.encrypt(string)时出现此错误: 线程“main”中的exceptionorg.jasypt.exceptions.EncryptionInitializationException:java.security.NoSuchAlgorithmException:PBEWithHmacAndSHA256 SecretKeyFactory不可用 在org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:597) 在org.jasypt.encryption.pbe.StandardPBEStringEncryptor.initialize(StandardPBEStringEncryptor.java:488) at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:541) 在nysenateapi.XmlRpc.main(XmlRpc.java:52) 引起:java.security.NoSuchAlgorithmException:PBEWithHmacAndSHA256 SecretKeyFactory不可用 在javax.crypto.SecretKeyFactory。(DashoA13 * ..) 在javax.crypto.SecretKeyFactory.getInstance(DashoA13 * ..) at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:584) ……还有3个 我下载了JCE Cryptography扩展并将jar放在我的buildpath中,但这似乎没有做任何事情。 我尝试在上面的setAlgorithm中使用了许多组合,包括“PBE”,“PBEWithSha”(1 | 2 | 128 | 256)?,“PBEWithHmacSha”等。 我也尝试过使用BouncyCastle,但我也没有运气。 任何帮助或指导赞赏!

Java和Android之间的错误编码/解码Base64

作为我的问题,当我在Java和Android之间编码/解码Base64时,我遇到了一个大问题。 这是我的情况: 我在Java上使用ECC编写代码来加密/解密,mycode工作得非常好。 然后我尝试在Java上加密字符串并在Android上解密这个加密的字符串,它失败了。 我认为问题可能是编码/解码Base64。 这是我的代码: 1 /仅在Java上加密/解密: //ENCRYPT try { Cipher c = Cipher.getInstance(“ECIES”,BouncyCastleProvider.PROVIDER_NAME); c.init(Cipher.ENCRYPT_MODE,publicKey); encodeBytes = c.doFinal(origin.getBytes()); String encrypt = Base64.getEncoder().encodeToString(encodeBytes); System.out.println(“Encrypt:”+ encrypt+”\n”); } catch (Exception e) { e.printStackTrace(); } //////DECRYPT try { String abc = Base64.getDecoder().decode(encrypt); Cipher c = Cipher.getInstance(“ECIES”,”BC”); c.init(Cipher.DECRYPT_MODE,privateKey); //decodeBytes = c.doFinal(encodeBytes); decodeBytes = c.doFinal(abc); String deCrypt = new String(decodeBytes,”UTF-8″); […]

Java Android错误“RSA块的数据太多”

A在我的Android项目中有错误(RSA加密/解密)。 加密通过OK,但是当我尝试解密加密文本时,有一个错误: “RSA块的数据太多” 。 如何解决这个问题呢? 码: public String Decrypt(String text) throws Exception { try{ Log.i(“Crypto.java:Decrypt”, text); RSAPrivateKey privateKey = (RSAPrivateKey)kp.getPrivate(); Cipher cipher = Cipher.getInstance(“RSA/ECB/NoPadding”); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] cipherData = cipher.doFinal(text.getBytes());// <—-ERROR: too much data for RSA block byte[] decryptedBytes = cipher.doFinal(cipherData); String decrypted = new String(decryptedBytes); Log.i("Decrypted", decrypted); return decrypted; }catch(Exception e){ System.out.println(e.getMessage()); } return […]

使用OpenSSL加密的方式与Java相同

我必须使用bash脚本加密字符串,就像我使用javax.crypto.Cipher加密一样。 在java我使用AES-256,密钥为“0123456789”。 但是当我使用openssl时我不得不将“0123456789”转换为hex,但结果与java不一样 echo “lun01” | openssl aes-256-cbc -e -a -K 7573746f726530313233343536373839 -iv 7573746f726530313233343536373839 dpMyN7L5HI8VZEs1biQJ7g == Java的: public class CryptUtil { public static final String DEFAULT_KEY = “0123456789”; private static CryptUtil instance; private String chiperKey; private CryptUtil(String chiperKey) { this.chiperKey = chiperKey; } public static CryptUtil getInstance() { if (null == instance) { instance = […]

Java和.NET互操作(RSA)签名

我正在基于.net的智能卡上签署一些数据,并尝试在java环境中validation该签名 – 但没有成功。 智能卡(c#): RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024); // In a different method, rsaParams.Exponent and rsaParams.Modulus are set rsaProvider.ImportParameters(rsaParams); // Here I’m importing the key SHA1 sha1 = SHA1.Create(); byte[] signature = rsaProvider.SignData(data, sha1); 客户端(Java): Signature sig = Signature.getInstance(“SHA1withRSA”); sig.initVerify(rsaPublicKey); // initiate the signature with public key sig.update(data); // update signature with the data […]

每条消息都需要Cipher.init()吗?

假设两个客户端来回交换安全消息。 每次都必须为每条消息运行此块,或者在开始时只执行一次任何步骤: cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); cipher.init(Cipher.ENCRYPT_MODE, keySpec); output = cipher.doFinal(content); 我想提供一些上下文 – 虽然我还没有完全理解内部,但我的理解是,为了安全起见,更改每条消息的IV非常重要。 所以我认为这个问题的答案将取决于该步骤是在doFinal()阶段或init()….的引擎盖下发生的?

使用对称密钥(AES -128)签名并validation消息

我想知道可以使用对称密钥来签名消息吗? 我们可以使用共享密钥加密。 此外,当对称密钥用于签名时,可以在JAVA中使用哪些API来加载密钥并对消息进行签名? 如果我使用java.security中的Signature,它有一个api initSign,但它从公钥/私钥对中取私钥作为签名消息的参数。 这里的关键是对称密钥。 有什么指针吗?

如何在java服务器端解密cryptojs AES加密消息?

我有以下基于cryptojs的javascript加密/解密函数,它们运行得非常好。 我使用随机盐,随机iv值和特定密码,同时使用cryptpjs加密消息。 我重复使用相同的salt,iv和密码来生成密钥,同时解密加密的消息。 这部分效果很好.. function encrypt(){ var salt = CryptoJS.lib.WordArray.random(128/8); var iv = CryptoJS.lib.WordArray.random(128/8); console.log(‘salt ‘+ salt ); console.log(‘iv ‘+ iv ); var key128Bits = CryptoJS.PBKDF2(“Secret Passphrase”, salt, { keySize: 128/32 }); console.log( ‘key128Bits ‘+ key128Bits); var key128Bits100Iterations = CryptoJS.PBKDF2(“Secret Passphrase”, salt, { keySize: 128/32, iterations: 100 }); console.log( ‘key128Bits100Iterations ‘+ key128Bits100Iterations); var encrypted = […]

Java AES:没有安装的提供程序支持此密钥:javax.crypto.spec.SecretKeySpec

我正在尝试设置128位AES加密,并且我在Cipher.init上抛出一个exception: No installed provider supports this key: javax.crypto.spec.SecretKeySpec 我正在使用以下代码在客户端生成密钥: private KeyGenerator kgen; try { kgen = KeyGenerator.getInstance(“AES”); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } kgen.init(128); } SecretKey skey = kgen.generateKey(); 然后,此密钥将作为标头传递给服务器。 使用此函数进行Base64编码: public String secretKeyToString(SecretKey s) { Base64 b64 = new Base64(); byte[] bytes = b64.encodeBase64(s.getEncoded()); return new String(bytes); } […]

寻求AES-CTR加密输入

由于CipherOutputStream模式下的AES非常适合随机访问,因此我可以说我在AES-CTR模式下使用CipherOutputStream创建了数据源。 下面的库 – 不是我的 – 使用RandomAccessFile ,它允许寻找文件中的特定字节偏移量。 我最初的想法是使用CipherInputStream和一个使用正确参数初始化的Cipher ,但是它的API不会寻求并声明不支持mark和reset 。 我是否错过了可以为我做的这一部分API,我应该查看CTR的IV /块计数器的配置,并使用自定义输入流重新创建它(听起来像针对我self猎枪)或采取我错过的其他方法?