Tag: 密码学

在Java中生成和使用两个密钥进行加密和解密

我正在开发一个Java应用程序,它需要使用从不同字符串生成的两个密钥来加密和解密。 一个String来自用户,另一个是主密钥。 我看了网,发现了一些关于它的参考文献。 我非常想知道如何实现这一点。 我会展示我现在拥有的东西。 从代码中可以看出,我使用了其他stackoverflowpost中的一些代码并对其进行了一些修改。 我只是不知道如何从2个字符串生成2个密钥,从那里我可以获得用于解密的SecretKey desKey。 代码: public class Encryption { public void doStuff() { String plaintext = “abc”; SecretKey k1 = generateDESkey(); SecretKey k2 = generateDESkey(); String firstEncryption = desEncryption(plaintext, k1); String decryption = desDecryption(firstEncryption, k2); String secondEncryption = desEncryption(decryption, k1); System.out.println(firstEncryption); System.out.println(decryption); System.out.println(secondEncryption); } public static SecretKey generateDESkey() { KeyGenerator keyGen […]

ECC PublicKey的Java紧凑表示

java.security.PublicKey#getEncoded()返回密钥的X509表示,在ECC的情况下,与原始ECC值相比增加了很多开销。 我希望能够在大多数紧凑的表示中将PublicKey转换为字节数组(反之亦然)(即尽可能小的字节块)。 KeyType(ECC)和具体曲线类型是预先已知的,因此不需要对它们的信息进行编码。 解决方案可以使用Java API,BouncyCastle或任何其他自定义代码/库(只要许可证并不意味着需要使用它的开源专有代码)。

在AES解密时,给定Final Block未正确填充

首先,我会告诉我的主要目标是什么。 我将使用AES加密客户端中的某些内容,然后使用RSA公钥加密重要的AES规范,并将AES加密数据和RSA加密AES规范发送到服务器。 所以在服务器上,我将使用RSA私钥解密AES密钥规范,然后使用这些AES规范,我将解密AES加密数据。 我通过测试加密和解密成功地使RSA部分工作。 在实现RSa之前,我要使这个AES艺术工作。 对于客户端,我使用的是crypto-js $(“#submit”).click(function() { var salt = CryptoJS.lib.WordArray.random(16); var iv = CryptoJS.lib.WordArray.random(16); var pass = CryptoJS.lib.WordArray.random(16); var message = “Test Message for encryption”; var key128Bits = CryptoJS.PBKDF2(pass, salt, { keySize: 128 }); var key128Bits10Iterations = CryptoJS.PBKDF2(pass, salt, { keySize: 128, iterations: 10 }); var encrypted = CryptoJS.AES.encrypt(message, key128Bits10Iterations, { iv: iv, […]

AES 256加密问题

以下代码完美地实现了AES-128加密/解密。 public static void main(String[] args) throws Exception { String input = JOptionPane.showInputDialog(null, “Enter your String”); System.out.println(“Plaintext: ” + input + “\n”); // Generate a key KeyGenerator keygen = KeyGenerator.getInstance(“AES”); keygen.init(128); byte[] key = keygen.generateKey().getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(key, “AES”); // Generate IV randomly SecureRandom random = new SecureRandom(); byte[] iv = new byte[16]; […]

加密(模式和填充)

我的任务是编写一个涉及加密的小型Java控制台应用程序。 我不熟悉加密,所以我必须先做一些阅读。 到目前为止,给出的高级要求是AES-256应该用于生成一次性密钥来加密文件。 之后,应使用收件人的公钥(RSA-2048)来加密该AES-256一次性密钥。 然后,加密文件和加密的一次性AES-256密钥将被压缩并发送给收件人。 根据我对读取加密和解密的理解,除了算法(RSA,AES等)之外,还有称为模式和填充的东西。 例如,以下代码将RSA指定为算法,ECB模式和PKCS1Padding。 Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); 必须在加密和解密中使用相同的算法,模式和填充。 因此,向用户询问他们想要的模式和填充是否合理? 我注意到Cipher cipher = Cipher.getInstance(“RSA”)似乎使用了ECB的默认模式和PKCS1Padding的填充,因此这行代码与上面相同。 那么可以假设ECB模式和PKCS1Padding模式将默认用于RSA-2048吗?

AES加密,在解密文件中获得额外的垃圾字符

我在Android应用程序中进行调试登录function。 我有一个简单的类, 使用128位AES加密记录到.txt文件。 记录完成后, 我用一个简单的JAVA程序解密记录的文件。 问题是,当我解密加密日志时我得到了一些奇怪的内容,我也得到了加密内容,但是还有一些额外的字符,见下文。 Android应用日志记录部分: public class FileLogger { //file and folder name public static String LOG_FILE_NAME = “my_log.txt”; public static String LOG_FOLDER_NAME = “my_log_folder”; static SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd_HH-mm-ss_SSS”); //My secret key, 16 bytes = 128 bit static byte[] key = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6}; //Appends to a log file, using encryption public static […]

BadPaddingException解密Android中的加密数据

我是Android安全概念的新手。 我一直在阅读一些博客,以了解我们可以使用公钥加密数据,并可以使用相应的私钥解密它。 加密似乎没有任何问题,但是当我尝试解密时,它会抛出: javax.crypto.BadPaddingException:错误:0407106B:rsa例程:RSA_padding_check_PKCS1_type_2:块类型不是02。 我的代码如下: public String RSAEncrypt(final String plain, PublicKey publicKey ) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(“RSA”); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte [] encryptedBytes = cipher.doFinal(plain.getBytes()); String encrypted = bytesToString(encryptedBytes); System.out.println(“EEncrypted?????” + encrypted ); return encrypted; } public String RSADecrypt(String encryptedBytes,PrivateKey privateKey ) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException […]

使用AES加密和解密图像的正确方法

编辑:::问题中的代码有效,但一旦图像在相机中拍摄,返回活动大约需要10秒钟。 我放弃了这种方法,并使用Facebook的隐藏库来加密和解密图像。 链接到Facebook的解决方案: Facebook隐藏 – 图像加密和解密 我已经查看了很多示例,但仍然无法找到一种正确的加密和解密方法。 当我在互联网上使用一些随机代码时,我认为我弄错了,但在解码时,我得到了BadPaddingexception。 所以,我正在尝试解决它。 我按照以下问题进行操作,正如大多数人在SO上所建议的那样(但此代码显示了如何加密字符串)。 有人可以帮助我加密和解密图像吗? 问题中的代码是否适用于图像? 链接到问题: Java 256位AES密码加密 这是我到目前为止所做的事情: //用于存储iv和密码的全局arraylist static ArrayList ivandcipher = new ArrayList(); //生成密钥 public static SecretKey generateKey() throws NoSuchAlgorithmException { char[] password = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ }; byte[] salt = { 1, 2, 3, 4, 5 }; SecretKeyFactory factory = SecretKeyFactory […]

在android中使用AES CTR模式随机访问InputStream

我无法找到任何用于随机访问的AES CTR加密的工作示例。 有人可以指导我如何使用CTR MODE中的计数器如何实现跳转到流中的特定位置? 默认流实现( CipherInputStream )不会跳过流并破坏纯文本。 我正在尝试解密存储在Android中的SD卡上的加密video文件。 嵌入式HTTP文件服务器即时解密它。 一切正常,直到用户在video中执行搜索:video立即停止,因为它接收到损坏的video流。 我正在使用以下代码来初始化和加密/解密流(为了简单起见,我对密钥进行了硬编码。它不会在生产中进行硬编码) ByteBuffer bb = ByteBuffer.allocate(16); bb.put(“1234567891230000”.getBytes()); byte[] ivString = bb.array(); // INITIALISATION String keyString = “1234567812345678”; IvParameterSpec iv = new IvParameterSpec(ivString); SecretKeySpec keySpec = new SecretKeySpec(keyString.getBytes(), “AES”); // FOR ENCRYPTION Cipher cipher = Cipher.getInstance(“AES/CTR/NoPadding”); cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(ivString)); Inputstream encrypted_is = new CipherInputStream(in, cipher); // […]

AES使用openssl命令行工具加密,并在Java中解密

我有一个使用openssl工具加密的bash脚本。 #!/bin/bash key128=”1234567890123456″ iv=”1234567890123456″ openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv 以及尝试解密脚本生成的文件的Java代码。 public class crypto { public static void main( String[] args ) { try { File f = new File(“test.enc”); Cipher c; Key k; String secretString = “01020304050607080900010203040506”; String ivString = “01020304050607080900010203040506”; byte[] secret = hexStringToByteArray(secretString); byte[] iv = hexStringToByteArray(ivString); […]