|
Skippums wrote: 1. encryptedBytes.length == 32,
In PKCS5 padding used here, the block length is fixed( may be 16), since the bytes available are insufficient, the call is blocked until the full 32 bytes arrive the stream or end of stream is detected, that is -1 is returned from the parent stream (ByteArrayInputStream in this case).
A cryptanalyst will be able to explain you better about the working of the padding schemes and ciphers.
|
|
|
|
|
Sorry, I should have clarified in my post; I know that the length of the encrypted byte array was correct at 32 bytes long. When I searched for an answer to my question, the first thing people trying to help ask is, "what is the length of your encrypted stream?" Most people were getting something that was NOT a multiple of the block size, which indicates the error is earlier than the read phase. I posted that information to try and "prove" that the error was during the read phase, and NOT during the write phase (especially since I can get the information out of the stream if I use it in a unique way).
As for your other answer, the code I posted was a minimal example of how to illustrate the problem, but in no way reflects how I am actually attempting to use the CipherInputStream/CipherOutputStream classes. Essentially, I am attempting to the interface to the crypto API significantly easier by creating a factory that returns a CipherInputStream/CipherOutputStream when the client passes in enumerated values for the cipher mode and padding mode.
And yes, you are correct that for AES the block size is 16 bytes. For now, I just created a class called CipherInputStreamWrapper, and overloaded the read(byte[], int, int) method to iteratively call CipherInputStream.read(). This approach works, but I think it illustrates a flaw in the underlying implementation of CipherInputStream in Java 6 and 7 (tested in both). Thank you for taking the time to answer my post, any other ideas as to how to solve this problem are welcome!
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
For anyone else looking for an answer to this, I couldn't find one. However, I am able to perform the following workaround: Instead of returning a CipherInputStream, I return a CipherInputStreamWrapper, which I define to be the following internal class:
class CipherInputStreamWrapper extends CipherInputStream {
CipherInputStreamWrapper(final InputStream is, final Cipher cipher) {
super(is, cipher);
}
@Override
public int read(final byte[] b) {
return this.read(b, 0, b.length);
}
@Override
public int read(final byte[] b, final int off, final int len) {
for (int i = 0; i < len; ++i) {
final int nextByte = this.read();
if (nextByte < 0) return i;
b[off + i] = (byte)nextByte;
}
return len;
}
} The implementation of read(byte[]) is actually identical to that in CipherInputStream in Java 6 and 7, but if the implentation changes in the future, NOT overloading that method would result in yet another erroneous implementation. I am always open to other ideas if anyone else has a cleaner solution!
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
See javadoc for CipherInputStream[^]
This method blocks until input data is available or end of stream is reached or an exception is thrown.
Keep this in mind. The last block is not decrypted and returned, until end of stream is reached. Circumventing this approach MAY LEAD TO DATA CORRUPTION!
|
|
|
|
|
Sorry, I must be thick-headed, but I still don't understand. In my case, it seems (to me) that either:
1. Input data is available, or
2. The end of stream is reached
I am still not getting how neither of these is true, regardless of whether it is the final block or not. Can you elaborate on what exactly is happening that is making both of those conditions false? Thanks,
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
Lets Take an example of network streams,
If socket is not closed and no data is being sent, then stream.available() will return 0, but end of stream is not reached, so the final block is not returned. Similar case can be with memory streams...
|
|
|
|
|
Ah, got it. I thought you were commenting on my specific example. So this comment was simply to caution me about specific cases that may break my proposed implementation, but does not explain why my example code in the original post is not returning the final block. Is this correct?
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
Skippums wrote: So this comment was simply to caution me about specific cases that may break my
proposed implementation
Yup, the comment was to caution you about the specific cases that may break your implementation.
But your example might also be related. I never tried in on my system!
|
|
|
|
|
I have just started Java I at the UoP and I am totally lost. How do we know what code to enter? Is there a code library? Please HELP!
Garde333
|
|
|
|
|
Member 10085678 wrote: How do we know what code to enter?
How can we say what code to enter... And what do you mean by this line... Doesn't make sense!
|
|
|
|
|
OOPs! Sorry! I have no idea what that was.... What I meant to say was how do we know what code to enter? I see it like this, if I wanted to learn another language I would buy… for example a French dictionary to learn the words and make my own sentences. I am assuming Java is the same thing we must learn the language to make up our own code to create a program. For instance…
"int payment = salary + bonus " means create a number variable called "payment" I know this because I googled it. How or where do I go to learn these specific codes? How do I learn that I have to put “int” before a code to get a result? And so on? I feel totally lost any help will be greatly appreciated!
Thank you!
|
|
|
|
|
If it's a Java course, then obviously you won't know until they teach it to you.
|
|
|
|
|
You could start here[^], but, I would assume you have a teacher who is going to explain things to you.
Use the best guess
|
|
|
|
|
Hello thank you for your help….The thing is that I am taking classes online and you pretty much have to teach yourself by reading. This is the thing I have downloaded the JDK for Java and I have the NetBean running. However this is my question, how do we learn to code? For example if I wanted to know French I would get a French dictionary to learn what each word means and put my own sentences together. Since Java is a computer language how do I write my own code? Is there a library or some sort of Java dictionary that we (beginners) can use to make our own code (Java sentences)? LOL!
Thank you
|
|
|
|
|
Well I already gave you the link to the Java tutorials, so you should work through them. They contain everything you need to learn the basics of Java programming.
Use the best guess
|
|
|
|
|
Thanks , that was help full to me also.
Jignesh PH
|
|
|
|
|
Look at this link ... Java[^]
|
|
|
|
|
You are newbie in java so i want to suggest you a free online java course. The course is totally free. You can use this tutorial to learn at your own place.
https://www.udemy.com/java-basics-for-j2ee-and-android/?couponCode=techdisfree
|
|
|
|
|
how to get the select box's selected value of one jsp file in to another jsp file please suggest me with some code samples
|
|
|
|
|
Your question is not clear. Try to explain in more detail.
Use the best guess
|
|
|
|
|
i have 3 select drop down boxes in those,in first box i have to print the district names and in second box i have to print the perticular mondal list based on the first selection boxs district and in third box i have to print the village names that is based on the second select boxs result, and these values that is disrict,mondal and village names are in database table please suggest r explain in jsp
|
|
|
|
|
Without knowing the structure of your database or your application it's impossible to say more than: Read the first set of items and populate the first listbox. Then when an item is selected in the listbox use its content to read the next list in sequence and populate the next listbox. And do on as each listbox selection changes.
Use the best guess
|
|
|
|
|
I'm receiving files on a TCP server.(one after another or multiple files one by one)
I want to use them in a LIFO order.
How can I store these files and use these files in java?
|
|
|
|
|
Store Reference to the files in a Stack/Array... Easy Peasy
|
|
|
|
|
I am an intermediate Java EE developer who wants to develop an online payment system that would work with either a bank or other online payment systems. My problem is because I am inexperienced in this area, the solution I have may not be robust and secure enough, I would like to know what are the issues I have to consider and if possible code samples with explanation to solving this problem.
|
|
|
|