cipher java 长度不变_关于加密:java.security.InvalidKeyException:密钥长度不是128/192/256位...

Code snippet:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.security.Key;

import java.security.InvalidKeyException;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.Security;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.spec.SecretKeySpec;

import java.security.SecureRandom;

public class MainClass {

/**

* @param args

* Encryption and Decryption with AES/ECB/PKCS7Padding  and RSA/ECB/PKCS1Padding

*/

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

System.out.println("Enter a Message to be encrypted!");

// Read an input from console

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String s = br.readLine();

// Get the bytes of the input stream. Convert the input text

// to bytes.

byte[] input = s.getBytes("UTF8");

System.out.println("Input Message :" + new String(input));

// AES 128 bits Symmetric encryption of data

// Generate the AES key for Symmetric AES encryption

KeyGenerator kgenerator = KeyGenerator.getInstance("AES","BC");

SecureRandom random = new SecureRandom();

kgenerator.init(128, random);

Key aeskey = kgenerator.generateKey();

byte[] raw = aeskey.getEncoded();

int sykLength = raw.toString().length();

SecretKeySpec skeySpec = new SecretKeySpec(raw,"AES");

System.out.println("Generated Symmetric Key :" + raw);

System.out.println("Generated Symmetric Key Length :" + sykLength);

System.out.println("Generated Key Length in Bytes:" + raw.length);

// Encrypt the data using AES cipher

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] cipherText = new byte[cipher.getOutputSize(input.length)];

int ctLength = cipher.update(input, 0, input.length, cipherText, 0);

ctLength += cipher.doFinal(cipherText, ctLength);

System.out.println("Encrypted Message :" + new String(cipherText));

System.out.println("Encrypted Message Length:" + ctLength);

// RSA 1024 bits Asymmetric encryption of Symmetric AES key

// Generate Public and Private Keys (Can also use a certificate for keys)

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA","BC");

kpg.initialize(1024, random);

KeyPair kpa = kpg.genKeyPair();

RSAPublicKey pubKey = (RSAPublicKey) kpa.getPublic();

RSAPrivateKey privKey = (RSAPrivateKey)kpa.getPrivate();

// Encrypt the generated Symmetric AES Key using RSA cipher

Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding","BC");

rsaCipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] rawRSA = raw.toString().getBytes("UTF8");

byte[] cipherTextRSA = new byte[rsaCipher.getOutputSize(rawRSA.length)];

int ctLengthRSA = rsaCipher.update(rawRSA, 0, rawRSA.length, cipherTextRSA, 0);

ctLengthRSA += rsaCipher.doFinal(cipherTextRSA, ctLengthRSA);

System.out.println("Encrypted Symmetric Key :" + cipherTextRSA);

System.out.println("Encrypted Symmetric Key Length :" + ctLengthRSA);

System.out.println("Encrypted Symmetric Key Length in Bytes:" + cipherTextRSA.length);

// RSA Decryption of Encrypted Symmetric AES key

rsaCipher.init(Cipher.DECRYPT_MODE, privKey);

byte[] plainTextRSA = new byte[rsaCipher.getOutputSize(ctLengthRSA)];

int ptLengthRSA = rsaCipher.update(cipherTextRSA, 0, ctLengthRSA, plainTextRSA, 0);

ptLengthRSA += rsaCipher.doFinal(plainTextRSA, ptLengthRSA);

SecretKeySpec DecrypskeySpec = new SecretKeySpec(plainTextRSA,"AES");

System.out.println("Decrypted Symmetric Key:" + new String(plainTextRSA));

System.out.println("Decrypted Symmetric Key Length:" + ptLengthRSA);

System.out.println("Decrypted Symmetric Key Length in Bytes:" + plainTextRSA.length);

cipher.init(Cipher.DECRYPT_MODE, DecrypskeySpec, cipher.getParameters());

byte[] plainText = new byte[cipher.getOutputSize(ctLength)];

int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);

ptLength += cipher.doFinal(plainText, ptLength);

System.out.println("Decrypted Message:" + new String(plainText));

System.out.println("Decrypted Message Length:" + ptLength);

System.out.println("Decrypted Message Length in Bytes:" + plainText.length);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值