2010-08-23 2 views
1

저는 CRC를 배웠습니다. 어디서나 CRC128 및 CRC256 코드를 찾을 수 없습니다. 누구든지 C++ 또는 C# 코드를 갖고 있다면 나와 공유하십시오. 또한 웹 사이트에 대한 온라인 링크를 제공하십시오. 나는 초보자이며 전혀 코딩 할 수 없으며 이론과 수학을 코딩으로 변환 할 수 없습니다. 그래서 나는 너에게 도움을 청한다. 나에게 적절하고 간단한 코드를 제공하는 것은 당신의 친절 할 것입니다. 누구든지 나에게이 코드를 제공하면 CRC 테이블 생성기 기능도 제공하십시오. 고맙습니다.누구든지 C++ 및 C#에서 CRC128 및 CRC256 코드가 있습니까?

답변

2

CRC-128과 CRC-256이 정의되었지만 실제로 사용하는 사람은 누구인지 알 수 없습니다.

대부분의 경우 CRC를 사용한다고 생각하는 개발자는 실제로 많은 응용 프로그램에서 CRC를 성공한 cryptographic hash function을 사용해야합니다. CRC-128 또는 CRC-256이 깨진 MD5보다 우수하고 SHA-2 패밀리가 훨씬 적다는 것은 드문 경우입니다.

+1

위키피디아는 CRC-128과 CRC-256을 "기술적으로 무능함"이라고 부릅니다. http://en.wikipedia.org/wiki/Cyclic_redundancy_check#Commonly_used_and_standardized_CRCs –

3

다음은 최근에 CRC로 재생할 때 작성한 Java 클래스입니다. 비트 순서 변경은 비트 연산에만 구현된다는 점에 유의하십시오.

/** 
* A CRC algorithm for computing check values. 
*/ 
public class Crc 
{ 
public static final Crc CRC_16_CCITT = 
    new Crc(16, 0x1021, 0xffff, 0xffff, true); 
public static final Crc CRC_32 = 
    new Crc(32, 0x04c11db7, 0xffffffffL, 0xffffffffL, true); 


private final int _width; 
private final long _polynomial; 
private final long _mask; 
private final long _highBitMask; 
private final long _preset; 
private final long _postComplementMask; 
private final boolean _msbFirstBitOrder; 
private final int _shift; 

private final long[] _crcs; 



/** 
* Constructs a CRC specification. 
* 
* @param width 
* @param polynomial 
* @param msbFirstBitOrder 
*/ 
public Crc(
    int width, 
    long polynomial) 
{ 
    this(width, polynomial, 0, 0, true); 
} 


/** 
* Constructs a CRC specification. 
* 
* @param width 
* @param polynomial 
* @param msbFirstBitOrder 
*/ 
public Crc(
    int width, 
    long polynomial, 
    long preset, 
    long postComplementMask, 
    boolean msbFirstBitOrder) 
{ 
    super(); 
    _width = width; 
    _polynomial = polynomial; 
    _mask = (1L << width) - 1; 
    _highBitMask = (1L << (width - 1)); 
    _preset = preset; 
    _postComplementMask = postComplementMask; 
    _msbFirstBitOrder = msbFirstBitOrder; 
    _shift = _width - 8; 

    _crcs = new long[256]; 
    for (int i = 0; i < 256; i++) 
    { 
     _crcs[i] = crcForByte(i); 
    } 
} 


/** 
* Gets the width. 
* 
* @return The width. 
*/ 
public int getWidth() 
{ 
    return _width; 
} 


/** 
* Gets the polynomial. 
* 
* @return The polynomial. 
*/ 
public long getPolynomial() 
{ 
    return _polynomial; 
} 


/** 
* Gets the mask. 
* 
* @return The mask. 
*/ 
public long getMask() 
{ 
    return _mask; 
} 


/** 
* Gets the preset. 
* 
* @return The preset. 
*/ 
public long getPreset() 
{ 
    return _preset; 
} 


/** 
* Gets the post-complement mask. 
* 
* @return The post-complement mask. 
*/ 
public long getPostComplementMask() 
{ 
    return _postComplementMask; 
} 


/** 
* @return True if this CRC uses MSB first bit order. 
*/ 
public boolean isMsbFirstBitOrder() 
{ 
    return _msbFirstBitOrder; 
} 


public long computeBitwise(byte[] message) 
{ 
    long result = _preset; 

    for (int i = 0; i < message.length; i++) 
    { 
     for (int j = 0; j < 8; j++) 
     { 
      final int bitIndex = _msbFirstBitOrder ? 7 - j : j; 
      final boolean messageBit = (message[i] & (1 << bitIndex)) != 0; 
      final boolean crcBit = (result & _highBitMask) != 0; 

      result <<= 1; 
      if (messageBit^crcBit) 
      { 
       result ^= _polynomial; 
      } 
      result &= _mask; 
     } 
    } 

    return result^_postComplementMask; 
} 


public long compute(byte[] message) 
{ 
    long result = _preset; 

    for (int i = 0; i < message.length; i++) 
    { 
     final int b = (int) (message[i]^(result >>> _shift)) & 0xff; 

     result = ((result << 8)^_crcs[b]) & _mask; 
    } 
    return result^_postComplementMask; 
} 


private long crcForByte(int b) 
{ 
    long result1 = (b & 0xff) << _shift; 
    for (int j = 0; j < 8; j++) 
    { 
     final boolean crcBit = (result1 & (1L << (_width - 1))) != 0; 

     result1 <<= 1; 
     if (crcBit) 
     { 
      result1 ^= _polynomial; 
     } 
     result1 &= _mask; 
    } 
    return result1; 
} 


public String crcTable() 
{ 
    final int digits = (_width + 3)/4; 
    final int itemsPerLine = (digits + 4) * 8 < 72 ? 8 : 4; 

    final String format = "0x%0" + digits + "x, "; 

    final StringBuilder builder = new StringBuilder(); 
    builder.append("{\n"); 
    for (int i = 0; i < _crcs.length; i += itemsPerLine) 
    { 
     builder.append(" "); 
     for (int j = i; j < i + itemsPerLine; j++) 
     { 
      builder.append(String.format(format, _crcs[j])); 
     } 
     builder.append("\n"); 
    } 
    builder.append("}\n"); 
    return builder.toString(); 
} 
} 
+0

이 코드에 회신 해 주셔서 감사합니다. CRC128 또는 CRC256에 맞는 C# 호환 코드가 필요합니다. – Tush

2

CRC-128 및 CRC-256 다음 세 가지 점에 해당하는 경우에만 의미가 :

  1. 당신은 암호 해시 크게 당신에게
  2. 속도를 느리게하는 위치에 구속 CPU입니다 사고 충돌이 통계적으로
  3. OTOH 고의적 인 충돌이 문제
없는 1^(64)이 여전히 너무 높다, 일이 안됩니다

2와 3이 함께 적용될 수있는 전형적인 경우는 실수로 인한 충돌로 인해 플랫폼이 아닌 데이터의 보낸 사람에게만 영향을주는 데이터 손실이 발생하는 경우입니다.

1

실수로 충돌 비율이 32 비트 및 64 비트 CRC의 경우 각각 2^32 또는 1^2^64 이상임을 제외하고는 동의합니다.

추적 항목에 대한 CRC 값으로 사물을 추적하는 앱을 작성했습니다. 우리는 잠재적으로 수백만 개의 아이템을 추적 할 필요가있었습니다. 실제 시나리오에서 충돌 속도가 약 1^2^16 인 CRC32로 시작했는데 이는 불쾌한 놀라움이었습니다. 그런 다음 실제 충돌 속도가 약 1/2^23 인 CRC64를 사용하도록 다시 코딩했습니다. 우리가 시작한 32 비트의 불쾌한 놀라움과 64 비트의 작은 오류율을 받아 들인 후에 이것을 테스트했습니다.

예상되는 충돌 속도 뒤에 통계를 설명 할 수는 없지만 비트의 너비보다 훨씬 빨리 충돌이 발생한다는 것은 의미가 있습니다. 해시 테이블처럼 ... 일부 해시 버킷은 비어 있고 다른 항목은 하나 이상의 항목이 있습니다.

256 비트 CRC의 경우에도 처음 2 개의 CRC는 동일 할 수 있습니다 ... 거의 믿을 수 있지만 가능한.

관련 문제