CRC

A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to identify accidental changes to raw data. Blocks of data entering these systems receive a short check value based on the remainder of a polynomial division of their contents. This method primarily detects data errors during data transmission and reception. Different types of Cheks are available based on the number of bits used.

  • CRC stands for Cyclic Redundancy Check.
  • We use CRC for error detection during data transmission.
  • Both the sender and receiver use the same generator polynomial.
  • When we store or interface digital data, corruption might occur. The system divides transmitted messages into predetermined lengths and applies a fixed divisor. Based on the calculation, it appends the remainder to the message and sends it. When the receiver gets the message, it recalculates the remainder and compares it with the transmitted remainder. If the numbers do not match, the system detects an error.
  • CRC comes in several types: CRC64, CRC32, CRC16, CRC8, CRC4, and CRC1.
  • Our device includes a CRC IP. However, the application must explicitly call and use it when required. This implementation uses CRC-64.
  • CRC Online Tool : https://crccalc.com/
CC
CRC

CRC

The sender and receiver share a generator polynomial. They utilize it whenever storing or transmitting digital data. The risk of data corruption exists in such processes. To address this risk, transmitted messages undergo segmentation into predetermined lengths. Subsequently, these segments are divided by a fixed divisor, and the remainder of this division gets calculated and appended to the message before transmission. Upon message reception, the recipient recalculates the remainder and compares it to the transmitted remainder. If the numbers fail to match, an error is detected. This process contributes to ensuring the integrity of transmitted data in digital systems.

You can access web-based online tools for Error Check calculation at this link: https://crccalc.com/

CRC Types

  • Many different types are available for error detection.
  • Mainly based on the bits we can segregate some types are 1Bit, 4Bits, 8 Bits, 16 Bits, 32Bits, 64bits.
  • Some other types MD5/SHA1/SHA256.
  • We do have an IP within the device, but the application needs to call and use it specifically when applicable. It is a 64 implementation.
AlgorithmAlgorithmAlgorithmHash Algo Result (Only HEX)
8/CDMA200016/CCITT-FALSE32/BZIP2MD5
8/DARC16/ARC32CSHA1
8/DVB-S216/AUG-CCITT32DSHA256
8/EBU16/BUYPASS32/MPEG-2
8/I-CODE16/CDMA200032/POSIX
8/ITU16/DDS-11032Q
8/MAXIM16/DECT-R32/JAMCRC
8/ROHC16/DECT-X32/XFER
8/WCDMA16/DNP
16/EN-13757
16/GENIBUS
16/MAXIM
16/MCRF4XX
16/RIELLO
16/T10-DIF
16/TELEDISK
16/TMS37157
16/USB
A
16/KERMIT
16/MODBUS
16/X-25
16/XMODEM

Error Detection using CRC

A simple error-detection scheme in which each transmitted message is accompanied by a numerical value based on the number of set bits in the message. The receiving station then applies the same formula to the message and checks to make sure the accompanying numerical value is the same. If not, the receiver can assume that the message has been garbled.

Encryption Method

  • Asymmetric Vs Symmetric

Asymmetric Encryption

ARC 16 Algorithm

The below code is for ARC 16

/*ArunEworld*/
#include <stdio.h>
#include <stdint.h>

//Table for CRC values
static const uint16_t CrcArc16Table[] =
{
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040,
};

uint16_t CrcArc16(const uint8_t* BufPtr, uint16_t Length, uint16_t SeedValue)
{
	const uint8_t* BufPtrAddr = BufPtr;
	uint32_t CrcVal = SeedValue;

	if (BufPtrAddr)
	{
		while (Length != 0)
		{
			Length -= 1;
			CrcVal = (CrcVal >> 8) ^ CrcArc16Table[(*BufPtrAddr ^ CrcVal) & 0x00FF];
			BufPtrAddr += 1;
		}
	}
	return (uint16_t)CrcVal;
}

int main()
{
	char Buf[]={'A','r','u','n','E','w','o','r','l','d','\0'};
	int result = CrcArc16(Buf,sizeof(Buf), 0);
	printf("Given String :%s \n",Buf);
	printf("CRC ARC 16 value :%x \n",result );

	return 0;
}

/************* OutPut *********/
/*
Given String :ArunEworld
CRC ARC 16 value :514

...Program finished with exit code 0
Press ENTER to exit console.
*/
/***********************************/

Reference

Please turn AdBlock off, and continue learning

Notice for AdBlock users

Please turn AdBlock off
Index

Discover more from ArunEworld

Subscribe now to keep reading and get access to the full archive.

Continue reading