Java 部分解密字符串&;这是胡言乱语
我使用的嵌入式Derby需要Java 部分解密字符串&;这是胡言乱语,java,encryption,derby,bouncycastle,Java,Encryption,Derby,Bouncycastle,我使用的嵌入式Derby需要无填充和blockSize=8字节,以及Bouncy Castle 在以下代码中,问题是: 加密的字符串的byteArray长度为20字节。从DB检索到的byteArray长度为20字节,而encryptBlock值仅提供8字节的长度 即使是8个字节也是乱七八糟的 如何将IV嵌入密码文本 3.嵌入IV的一般方法是使用它预先修复加密文本,它不需要保密。正如名称所述,encryptBlock处理一个在您的情况下为8字节的块,因为您使用64位段初始化了CFBsize@Ar
无填充
和blockSize=8
字节,以及Bouncy Castle
在以下代码中,问题是:
字符串的byteArray
长度为20字节。从DB检索到的byteArray
长度为20字节,而encryptBlock
值仅提供8字节的长度
3.嵌入IV的一般方法是使用它预先修复加密文本,它不需要保密。正如名称所述,
encryptBlock
处理一个在您的情况下为8字节的块,因为您使用64位段初始化了CFBsize@Artjom..Derby加密声明块大小应该是8字节…那么在这种情况下我应该如何解密所有数据?对不起,我不知道这段代码与Apache Derby有什么关系。AES的块大小为16字节。CFB模式可以将其转换为8字节的段大小。我看过一些文档,其中提到了DES和Blowfish,它们的块大小都是8字节。我不知道你想做什么,也不知道你为什么要写这段代码。@Artjom..谢谢…实际上Derby docs声明了块密码(BlockCipher,BitBlockSize)…我同意你的观点,问题在于密码初始化。。。
private CFBBlockCipher cipher() {
secureRandom = new SecureRandom(KEY);
byte[] randomBytes = new byte[32];
secureRandom.nextBytes(randomBytes);
kgp = new KeyGenerationParameters(secureRandom, 256);
ckg = new CipherKeyGenerator();
ckg.init(kgp);
sk = ckg.generateKey();
/* Initialize cipher parameters....with key & the IV */
cipherParameters = new ParametersWithIV(new KeyParameter(sk), IVBYTES); //IVYTES array
/*3- Generate the encryption & decryption ciphers*/
CFBB = CFBBlockCipher(new AESEngine(), BITBLOCKSIZE); //BITBLOCKSIZE =64bit
byte[] cfbbMoneyOneCurrentIV = CFBB.getCurrentIV();
/*4- initialize the cipher*/
CFBB.init(true, cipherParameters);
return CFBB;
}
private void resetCipher() {
if (CFBB != null) {
CFBB.reset();
}
}
private byte[] encrypt(CFBBlockCipher CFBB,String stringOne) {
this.CFBB=CFBB;
/*1- get the stream data to be ciphered*/
stringOneByteArray = stringOne.getBytes(StandardCharsets.UTF_8);
toSaveByteArray = new byte[stringOneByteArray.length];
int encryptBlock = CFBB.encryptBlock(stringOneByteArray, 0, toSaveByteArray, 0);
System.out.println("encryptBlock length is :"+encryptBlock);
resetCipher();
return toSaveByteArray;
}
private InputStream decrypt(CFBBlockCipher CFBB) {
this.CFBB=CFBB;
//connect to DB, get column data/
String getData = "select moneyEditor from settingsTable where id=1";
try {
stmtOne = conn.createStatement();
boolean execute = stmtOne.execute(getData);
rsOne = stmtOne.getResultSet();
while (rsOne.next()) {
rsByteArray = rsOne.getBytes("moneyEditor");
if (rsByteArray != null) {
System.out.println("rsByteArray length is :" + rsByteArray.length);
toSaveDecryptByteArray = new byte[rsByteArray.length];
int decryptedByteArrayLength;
decryptedByteArrayLength = CFBB.decryptBlock(rsByteArray, 0, toSaveDecryptByteArray, 0);
System.out.println("decryptedByteArrayLength is :" + decryptedByteArrayLength);
isFromDecoded = new ByteArrayInputStream(toSaveDecryptByteArray);
} else {
isFromDecoded = null;
}
}
rsOne.close();
resetCipher();
} catch (SQLException ex) {
Logger.getLogger(FrontFace.class.getName()).log(Level.SEVERE, null, ex);
}
return isFromDecoded;
}