This is a java program to implement checksum method and verify message. A checksum or hash sum is a small-size datum from an arbitrary block of digital data for the purpose of detecting errors which may have been introduced during its transmission or storage. It is usually applied to an installation file after it is received from the download server. By themselves checksums are often used to verify data integrity, but should not be relied upon to also verify data authenticity.
The actual procedure which yields the checksum, given a data input is called a checksum function or checksum algorithm. Depending on its design goals, a good checksum algorithm will usually output a significantly different value, even for small changes made to the input. This is especially true of cryptographic hash functions, which may be used to detect many data corruption errors and verify overall data integrity; if the computed checksum for the current data input matches the stored value of a previously computed checksum, there is a very high probability the data has not been accidentally altered or corrupted.
Here is the source code of the Java Program to Implement the Checksum Method for Small String Messages and Detect If the Received message is same as the Transmitted. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.
package com.maixuanviet.setandstring; import java.util.*; public class ChecksumMethod { public static void main(String args[]) { Scanner scan = new Scanner(System.in); System.out.println("Enter the string input:"); String input = scan.next(); int checksum = generateChecksum(input); // Call the method to create the checksum System.out.println("The checksum generated is = " + Integer.toHexString(checksum)); System.out.println("Enter the data to be sent:"); input = scan.next(); System.out.println("Enter the checksum to be sent:"); checksum = Integer.parseInt((scan.next()), 16); // User inputs data as hexadecimal value but it will be stored as a // decimal value unless it is converted into hexadecimal first. receive(input, checksum); scan.close(); } static int generateChecksum(String s) { String hex_value = new String(); // 'hex_value' will be used to store various hex values as a string int x, i, checksum = 0; // 'x' will be used for general purpose storage of integer values // 'i' is used for loops // 'checksum' will store the final checksum for (i = 0; i < s.length() - 2; i = i + 2) { x = (int) (s.charAt(i)); hex_value = Integer.toHexString(x); x = (int) (s.charAt(i + 1)); hex_value = hex_value + Integer.toHexString(x); // Extract two characters and get their hexadecimal ASCII values System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : " + hex_value); x = Integer.parseInt(hex_value, 16); // Convert the hex_value into int and store it checksum += x; // Add 'x' into 'checksum' } if (s.length() % 2 == 0) { // If number of characters is even, then repeat above loop's steps // one more time. x = (int) (s.charAt(i)); hex_value = Integer.toHexString(x); x = (int) (s.charAt(i + 1)); hex_value = hex_value + Integer.toHexString(x); System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : " + hex_value); x = Integer.parseInt(hex_value, 16); } else { // If number of characters is odd, last 2 digits will be 00. x = (int) (s.charAt(i)); hex_value = "00" + Integer.toHexString(x); x = Integer.parseInt(hex_value, 16); System.out.println(s.charAt(i) + " : " + hex_value); } checksum += x; // Add the generated value of 'x' from the if-else case into 'checksum' hex_value = Integer.toHexString(checksum); // Convert into hexadecimal string if (hex_value.length() > 4) { // If a carry is generated, then we wrap the carry int carry = Integer.parseInt(("" + hex_value.charAt(0)), 16); // Get the value of the carry bit hex_value = hex_value.substring(1, 5); // Remove it from the string checksum = Integer.parseInt(hex_value, 16); // Convert it into an int checksum += carry; // Add it to the checksum } checksum = generateComplement(checksum); // Get the complement return checksum; } static void receive(String s, int checksum) { int generated_checksum = generateChecksum(s); // Calculate checksum of received data generated_checksum = generateComplement(generated_checksum); // Then get its complement, since generated checksum is complemented int syndrome = generated_checksum + checksum; // Syndrome is addition of the 2 checksums syndrome = generateComplement(syndrome); // It is complemented System.out.println("Syndrome = " + Integer.toHexString(syndrome)); if (syndrome == 0) { System.out.println("Data is received without error."); } else { System.out.println("There is an error in the received data."); } } static int generateComplement(int checksum) { // Generates 15's complement of a hexadecimal value checksum = Integer.parseInt("FFFF", 16) - checksum; return checksum; } }
Output:
$ javac ChecksumMethod.java $ java ChecksumMethod Enter the string input: Sanfoundry Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 The checksum generated is = ede4 Enter the data to be sent: Sanfoundry Enter the checksum to be sent: ede4 Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 Syndrome = 0 Data is received without error. Enter the string input: Sanfoundry Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 The checksum generated is = ede4 Enter the data to be sent: sanfoundry Enter the checksum to be sent: ede4 sa : 7361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 Syndrome = ffffe000 There is an error in the received data.