Java by API/java.security/MessageDigest
Версия от 17:43, 31 мая 2010; (обсуждение)
extends MessageDigest
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.zip.CRC32;
public class MainClass {
static private String hexDigit(byte x) {
StringBuffer sb = new StringBuffer();
char c;
// First nibble
c = (char) ((x >> 4) & 0xf);
if (c > 9) {
c = (char) ((c - 10) + "a");
} else {
c = (char) (c + "0");
}
sb.append(c);
// Second nibble
c = (char) (x & 0xf);
if (c > 9) {
c = (char) ((c - 10) + "a");
} else {
c = (char) (c + "0");
}
sb.append(c);
return sb.toString();
}
static private String computeDigest(MessageDigest algorithm, String filename) {
String returnValue = "";
try {
algorithm.reset();
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
DigestInputStream dis = new DigestInputStream(bis, algorithm);
int ch;
while ((ch = dis.read()) != -1)
;
StringBuffer hexString = new StringBuffer();
byte digest[] = algorithm.digest();
int digestLength = digest.length;
for (int i = 0; i < digestLength; i++) {
hexString.append(hexDigit(digest[i]));
hexString.append(" ");
}
returnValue = hexString.toString();
} catch (IOException e) {
System.err.println("Error generating digest for: " + filename);
}
return returnValue;
}
public static void main(String args[]) {
MessageDigest algorithm = null;
Security.addProvider(new MyProvider());
try {
algorithm = MessageDigest.getInstance("CRC32");
} catch (NoSuchAlgorithmException e) {
System.err.println("Invalid algorithm");
System.exit(-1);
}
int argsLength = args.length;
for (int i = 0; i < argsLength; i++) {
String digest = computeDigest(algorithm, args[i]);
System.out.println(args[i] + " : " + digest);
}
}
}
class MyProvider extends Provider {
public MyProvider() {
super("MyProvider", 1.0, "jexp.ru Collections Example");
put("CRC32", "CRC");
}
}
class CRC extends MessageDigest {
CRC32 crc;
public CRC() {
super("CRC");
crc = new CRC32();
}
protected void engineReset() {
crc.reset();
}
protected void engineUpdate(byte input) {
crc.update(input);
}
protected void engineUpdate(byte[] input, int offset, int len) {
crc.update(input, offset, len);
}
protected byte[] engineDigest() {
long l = crc.getValue();
byte[] bytes = new byte[4];
bytes[3] = (byte) ((l & 0xFF000000) >> 24);
bytes[2] = (byte) ((l & 0x00FF0000) >> 16);
bytes[1] = (byte) ((l & 0x0000FF00) >> 8);
bytes[0] = (byte) ((l & 0x000000FF) >> 0);
return bytes;
}
}
MessageDigest: getInstance(String algorithm)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.zip.CRC32;
public class MainClass {
static private String hexDigit(byte x) {
StringBuffer sb = new StringBuffer();
char c;
// First nibble
c = (char) ((x >> 4) & 0xf);
if (c > 9) {
c = (char) ((c - 10) + "a");
} else {
c = (char) (c + "0");
}
sb.append(c);
// Second nibble
c = (char) (x & 0xf);
if (c > 9) {
c = (char) ((c - 10) + "a");
} else {
c = (char) (c + "0");
}
sb.append(c);
return sb.toString();
}
static private String computeDigest(MessageDigest algorithm, String filename) {
String returnValue = "";
try {
algorithm.reset();
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
DigestInputStream dis = new DigestInputStream(bis, algorithm);
int ch;
while ((ch = dis.read()) != -1)
;
StringBuffer hexString = new StringBuffer();
byte digest[] = algorithm.digest();
int digestLength = digest.length;
for (int i = 0; i < digestLength; i++) {
hexString.append(hexDigit(digest[i]));
hexString.append(" ");
}
returnValue = hexString.toString();
} catch (IOException e) {
System.err.println("Error generating digest for: " + filename);
}
return returnValue;
}
public static void main(String args[]) {
MessageDigest algorithm = null;
Security.addProvider(new MyProvider());
try {
algorithm = MessageDigest.getInstance("CRC32");
} catch (NoSuchAlgorithmException e) {
System.err.println("Invalid algorithm");
System.exit(-1);
}
int argsLength = args.length;
for (int i = 0; i < argsLength; i++) {
String digest = computeDigest(algorithm, args[i]);
System.out.println(args[i] + " : " + digest);
}
}
}
class MyProvider extends Provider {
public MyProvider() {
super("MyProvider", 1.0, "jexp.ru Collections Example");
put("CRC32", "CRC");
}
}
class CRC extends MessageDigest {
CRC32 crc;
public CRC() {
super("CRC");
crc = new CRC32();
}
protected void engineReset() {
crc.reset();
}
protected void engineUpdate(byte input) {
crc.update(input);
}
protected void engineUpdate(byte[] input, int offset, int len) {
crc.update(input, offset, len);
}
protected byte[] engineDigest() {
long l = crc.getValue();
byte[] bytes = new byte[4];
bytes[3] = (byte) ((l & 0xFF000000) >> 24);
bytes[2] = (byte) ((l & 0x00FF0000) >> 16);
bytes[1] = (byte) ((l & 0x0000FF00) >> 8);
bytes[0] = (byte) ((l & 0x000000FF) >> 0);
return bytes;
}
}
MessageDigest: isEqual(byte[] digesta, byte[] digestb)
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
public class Main {
public static void main(String args[]) throws Exception {
FileInputStream fis = new FileInputStream("test");
MessageDigest md = MessageDigest.getInstance("SHA");
DigestInputStream dis = new DigestInputStream(fis, md);
ObjectInputStream ois = new ObjectInputStream(dis);
Object o = ois.readObject();
if (!(o instanceof String)) {
System.out.println("Unexpected data in file");
System.exit(-1);
}
String data = (String) o;
System.out.println("Got message " + data);
dis.on(false);
o = ois.readObject();
if (!(o instanceof byte[])) {
System.out.println("Unexpected data in file");
System.exit(-1);
}
byte origDigest[] = (byte[]) o;
System.out.println(MessageDigest.isEqual(md.digest(), origDigest));
}
}