Java by API/java.security/MessageDigest

Материал из Java эксперт
Перейти к: навигация, поиск

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));
  }
}