痔になりやすい生活習慣とは?

http://oshiete.goo.ne.jp/qa/5000059.html


このページに
CRC32が一致する確立は16の8乗。MD5が一致する確立は16の32乗。

この意味するところは
【16^8】
4294967296

4294967296個のファイルを比較した際に異なるファイルであっても
同じファイルで判断されることがある。
という意味ですよね?

つまり、極めて小さな確率なので
二つのファイルが同一であるか調べるためには
MD5ではなくCRC32で十分ということでしょうか?


それと、10000個に一度くらいは異なるファイルであっても同じだと認識されても構わないので
もっと認証が粗く、計算速度の速いアルゴリズムがあれば教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

話の前提がわかりません。


予めCRCが計算されてファイルに付与されているのでしょうか?

ファイルを比較するだけなら、ファイルを読んでバイト単位で
比較した方が早い。

要は何がやりたいのかよくわからないということです。
    • good
    • 0

前半は特に付け加えることはありません。


> もっと認証が粗く、計算速度の速いアルゴリズムがあれば教えてください。
こっちについて。
CRCの計算よりファイルの読み出しの方が遅いので、これ以上の計算速度は無意味です。
ハッシュアルゴリズム側ではなく、ファイルサイズを見るとか、ファイルの一部分を見るとかの工夫が必要です。
    • good
    • 0

普通、同一性チェックをするなら、CRCだけで済ませたりはしないでしょう。


前処理で使って、CRCが一緒ならバイナリ比較で一致を確認するのが基本かと。
CRC32で4294967296=2^32というならCRC16なら2^16通りなので誤一致率は数万分の1程度になるのでは?

ただ上の数値はCRCの生成確率に偏りがないという(おそらく正しくない)仮定があるし、特定のファイルとの一致確率でなく任意に取ってきた2つの一致確率だと誕生日のパラドックスで言われるように、CRC32で1/2^16になるので、10000個に一個くらいは間違っても良いという条件だとCRC32くらいは必要なんじゃないかな。
# 誕生日のパラドックス http://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F% …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCRCやMD5

比較対象のファイルがCRC16若しくはCRC32が同じでも、MD5の値が違うことはあるんでしょうか?

またどちらか信頼ある値でしょうか?

よろしくお願いします。

Aベストアンサー

>比較対象のファイルがCRC16若しくはCRC32が同じでも、MD5の値が違うことはあるんでしょうか?

確率は低いけど、ありうる話。
CRC32が一致する確立は16の8乗。MD5が一致する確立は16の32乗。

>どちらか信頼ある値でしょうか?

もちろんMD5。
http://www.ipa.go.jp/security/rfc/RFC1510-06JA.html

QCRCによる誤り検出の条件

現在、CRCについて学んでいます。
その中で、誤り検出が可能な条件として、
誤りの多項式E(X)が生成多項式G(X)で割り切れないこと
というのがあると思います。

そこで例えば、rビットのバースト誤りの際に、
E(X) = x^(i) + x^(i+1) + … + x^(i+r-1)
= x^i * {1 + x + … + x^(r-1)}
(ただ、この最後の式でx~x^(r-2)までは、誤りによってあったりなかったりする筈です)
と表すことが出来て、生成多項式G(X)の次数がrであるとき、
1. x^iは(G(X)が2項以上の多項式であるなら)G(X)で割り切れない
2. {1 + x + … + x^(r-1)}は(次数がr-1であるから)G(X)で割り切れない
3. 従ってE(X)もG(X)で割り切れない
よって生成多項式の次数がrの場合、rビット以下のバースト誤りは検出できるとなっていますが、、、
いくら1.や2.がG(X)で割り切れなくても、それらの積(=E(X))がG(X)で割り切れてしまうことはあるじゃないですか。
具体的には、i=1のとき、もしG(X)がx * {1 + x + … + x^(r-1)}であれば、割り切れますし、、、

同様の話で、
http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1/advanced/crc/
こちらのページの、「4. 巡回符号の誤り検出」という部分でも、
「これらは、3次の生成多項式、例えば G(x) = x^3+x+1 で割り切れないことは明らかです。」
という記述に対して、「例えばG(X) = x^3+x^2+x^1であれば割り切れてしまうのでは」と反論したくなります。

もちろん、割り切れないようなG(X)を選べばいいと言われればそれまでですが、、、以上の様にG(X)の内容によっては「G(X)の次数r以下のバースト誤りが検出できる」のが自明とは思えません。
そもそもそれが答え、、、?
どなたかご説明お願いしますm(_ _)m

現在、CRCについて学んでいます。
その中で、誤り検出が可能な条件として、
誤りの多項式E(X)が生成多項式G(X)で割り切れないこと
というのがあると思います。

そこで例えば、rビットのバースト誤りの際に、
E(X) = x^(i) + x^(i+1) + … + x^(i+r-1)
= x^i * {1 + x + … + x^(r-1)}
(ただ、この最後の式でx~x^(r-2)までは、誤りによってあったりなかったりする筈です)
と表すことが出来て、生成多項式G(X)の次数がrであるとき、
1. x^iは(G(X)が2項以上の多項式であるなら)G(X)で割り切れない
2....続きを読む

Aベストアンサー

あ~, 「既約多項式」の方が通りがいいかな?

QCRC32の計算方法

ZIPファイルを作るときにCRC32を算出すると思うのですが、
CRC32の計算方法を教えてください。

よろしくお願いします。

Aベストアンサー

CRCとは巡回冗長検査(じゅんかい・じょうちょう・けんさ)という誤りを検出する方法の1つです。
その他ハッシュ・キーを計算するハッシュ関数としても使うことが出来ます。

今回のCRCは32ビット幅で生成多項式に X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1 を利用します。
この生成多項式は CRC32 で使われているものです。

1.CRCタイプ
(1)CRCタイプ(CRC32)
(2)生成多項式(0x04C11DB7)
(3)初期値(0xFFFFFFFF)
(4)出力XOR(0xFFFFFFFF)
(5)入力ビット逆転(なし)
(6)出力ビット逆転(なし)
(7)ビット送り(左送り)

// サンプル
#include <stdio.h>
#include <string.h>
#include <limits.h> // CHAR_BIT

// CRC32のテーブル情報
static unsigned long CRC32Table[ 256 ] = {
0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,
0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,
0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,
0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,
0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,
0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,
0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,
0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,
0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,

0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,
0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,
0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,
0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,
0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,
0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,
0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,
0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,
0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,
0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,
0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,
0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,
0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,

0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,
0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,
0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,
0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,
0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,
0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,
0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,
0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,
0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,
0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,
0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,
0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,

0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,
0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,
0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,
0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,
0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,
0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,
0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,
0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,
0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,
0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,
0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,
0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,
0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,
0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4,
};

// メモリのCRC32コードを計算
extern unsigned long getMemCRC32( unsigned long crc32, unsigned const char buff[], size_t size )
{
while ( size != 0 ){
crc32 = CRC32Table[ (crc32 >> (32 - CHAR_BIT)) ^ *buff ] ^ (crc32 << CHAR_BIT);
buff++;
size--;
}
return crc32;
}

// ファイルのCRC32コードを計算
extern unsigned long getFileCRC32( const char file[] )
{
unsigned long crc32 = 0xFFFFFFFF;
char buff[ 10 * 1024 ];
size_t size;
FILE *fp;

if ( (fp = fopen(file,"rb")) != NULL ){
do {
size = fread( buff, 1, sizeof(buff), fp );
crc32 = getMemCRC32( crc32, (unsigned const char *)buff, size );
} while ( size != 0 );

fclose( fp );
}
return crc32 ^ 0xFFFFFFFF;
}

// メイン関数
int main( void )
{
char file[ 256 ];
char *find;

while ( fgets(file,sizeof(file),stdin) != NULL ){
if ( (find = strchr(file,'\n')) != NULL ){
*find = '\0';
}
printf( "0x%08lX⇒%s\n", getFileCRC32(file), file );
}
return 0;
}

試し方:
ファイル名をフルパスで入力します。
またはパイプやリダイレクションを利用して入力させます。
出力は32ビットの16進8桁とフルパス名が標準出力に表示されます。

CRCとは巡回冗長検査(じゅんかい・じょうちょう・けんさ)という誤りを検出する方法の1つです。
その他ハッシュ・キーを計算するハッシュ関数としても使うことが出来ます。

今回のCRCは32ビット幅で生成多項式に X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1 を利用します。
この生成多項式は CRC32 で使われているものです。

1.CRCタイプ
(1)CRCタイプ(CRC32)
(2)生成多項式(0x04C11DB7)
(3)初期値(0xFFFFFFFF)
(4)出力XOR(0xFFFFFFFF)
(5)入力ビット逆転(な...続きを読む

QCRCのアルゴリズムって、どんな計算するんですか?

こんにちはお世話になります。
私はネットワークに興味があるオジサンです。
先日、データリンク層のプロトコル群を勉強していたとき、誤り訂正でCRCが出てきました。誤り訂正ではパリティーチェックやチェックサム等は聞き覚えがありましたが、CRCは始めて見たので興味を持ち少し調べてみようと思いました。
それが間違いの元でした。
インターネットでCRCの構造を詳しく解説するサイトが少なく、その解説は難しすぎて手におえません。
数学にはめっぽう弱い私には、多項式同士の加減乗除算などは頭痛の肥やしにしかなりません。
今ではCRCが気になって勉強に集中できない状態です。
そこで、表題にもあるCRCのアルゴリズムを、何方か分かり易く教えてくださいませんか。もしくは、CRCのアルゴリズムを簡単に解説している書籍をご存知でしたら教えてください。
カテゴリー(本来は数学系?)が違うかもしれませんが、何卒よろしくお願い申し上げます。

Aベストアンサー

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?これがだいじょう
ぶなら、1+1=0(つまり、0-1=1)という世界での2進数の加減乗除
を考えるということでも同じです。

この場合、x+1 という多項式は、11 と考えます。(xのi乗の係数
を第iビットの値とみなす)

例えば、10110 というデータに対して、11 という生成多項式で
CRC の検査ビットを求めるには、生成多項式の桁数-1=1ビット
分データを左にシフトして、101100 を得ます。この値を、上の特
殊な2進数の世界で、生成多項式の 11 で割ります。そうすると、
商として 11011、余りとして 1 が得られます。試しにやってみて
ください。この余りを、101100 から引いて(特殊な2進数の世界で
は足すのと同じ)やると、101101 が出ます。これが送るべき符号
ということになります。実際、1の個数は偶数ですので、付け足し
たビットが偶数パリティとなっていることがわかります。

余りの分を引いたわけですから、このデータは 11 で割り切れるは
ずですので、検査側では 11 で割って、余りが 0 であることを確
認すればいいわけです。

この生成多項式の選び方で、検査の能力が変わってきます。やみく
もに選んだら、検査能力がまったくなくなります。通常の CRC は、
それを考慮してうまく多項式を作ってあるというだけのことです。

なぜ 11 なら偶数パリティと同じなのかとか、生成多項式をどう選
べばいいかとかについては、符号理論の勉強が必要です。前者はそ
れほど難しくはないですが。

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?こ...続きを読む

QチェックサムとCRC

複数のデータを照合する時にチェックサムを使っています。
CRCというやり方もあると聞きましたが、
具体的にはどういうことをやるのでしょうか?
宜しくお願いします。

例えば、シリアル通信とかで8ビットデータが複数送られてきて、
そのデータ群が正しいかどうかをチェックする時。

Aベストアンサー

「CRC アルゴリズム」とかで検索すると出てくるかと。
http://hyphenlink.blog48.fc2.com/blog-entry-53.html とか。

んで…チェックサムの場合は…下記のような場合にエラーが検出されません。

・データの順番が入れ替わった場合。
 00 01 02 03 04 05 06 でチェックサムが15h
   ↓
 00 05 02 03 04 01 06 でもチェックサムは15h

・データの一部が減算されていて、別の一部が同じだけ加算されていた場合。
 00 01 02 03 04 05 06 でチェックサムが15h
   ↓
 04 01 00 00 09 01 06 でもチェックサムは15h

CRCだとデータの並びが変わった場合は算出されるCRC値も異なります。
 00 01 02 03 04 05 06 でCRC32がAD5809F9
 00 05 02 03 04 01 06 でCRC32が52A58EEB
 04 01 00 00 09 01 06 でCRC32が5DD68733

Qファイルのハッシュ値って何ですか?

同一のファイルを検索し削除するソフトで、ハッシュ値等を比較して同一かどうかを判断しるというものがありました。
このハッシュ値というのは何ですか?

Aベストアンサー

ハッシュ値、大きくアバウトに言ってしまうと、データを特定するするために、あるアルゴリズム(関数)から算出される値。
簡単な例では、データの同一性をチェックするための「チェックサム」もその1つ。コンパイラの高速テーブル検索でもハッシュが使われる。
「チェックサム」では、データを一定のビット数で区切ってその総和を、送り側で計算してデータに付加しておく。これが「チェックサム」といわれるの由来。
受け側でこの「チェックサム」を除く、純データの「チェックサム」を計算し直し、付き合わせることでデータの同一性をかなりの高確率で保証できる。

2006/07/05
株式会社タケキ IT教育事業部 出口 雄一
http://itpro.nikkeibp.co.jp/article/COLUMN/20060628/241960/
連載目次へ >>ポイント
●あるデータをハッシュ関数を使って計算した結果がハッシュ値である。メッセージ・ダイジェスト、フィンガープリント(指紋)とも呼ばれる
●ハッシュ値は基データのサイズに関わらず固定長になる。長さはアルゴリズムによって異なる
●ハッシュ値は「基データが異なれば、その計算結果であるハッシュ値も異なるのが普通で、同じハッシュ値になることはほとんどない」「ハッシュ値とハッシュ関数がわかっても、基のデータを特定できない」という特徴がある

チェックサム
出典: フリー百科事典『ウィキペディア(Wikipedia)』
http://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%B5%E3%83%A0
チェックサム (Check Sum)とは誤り検出符号の一種である。符号値そのものを指すこともある。他の誤り検出符号と比べて信頼性は低いが、それでも単純計算で99.5%以上(1オクテットのチェックサムの場合255/256、2オクテットなら65535/65536)の検出率がある上にアルゴリズムが簡単であることから、簡易な誤り検出に用いられる。
また、誤り検出その他データの検証のための符号として広く使われてきた経緯から、俗に誤り検出符号自体の代名詞としても用いられる場合がある。例えばCRCの符号値やMD5のハッシュ値を、それぞれ「CRCチェックサム」「MD5チェックサム」と呼ぶことがある。これらはアルゴリズムが異なりsumでもないため「チェックサム」と呼ぶことは明らかな誤解であるものの、「(チェックサムよりも)信頼性の高い誤り検出符号」程度の意味で使われる。

ネットワークを利用してのデータ送信時、IPパケットにデータを分割した際のIPヘッダの検査での利用例を以下に示す。
1.IPヘッダのチェックサムフィールドにゼロをセット
2.IPヘッダを16ビット単位で加算
3.総計の下位16ビットの補数をIPヘッダのチェックサムフィールドへセット
4.送信
5.受信したらIPヘッダを16ビット単位で加算
6.総計がゼロなら正常(チェックサムフィールドにはチェックサムフィールドがゼロの場合のチェックサムの補数がセットされているので、総計=チェックサムフィールド以外のチェックサム+チェックサムフィールド以外のチェックサムの補数=ゼロになれば正しい

ハッシュ値、大きくアバウトに言ってしまうと、データを特定するするために、あるアルゴリズム(関数)から算出される値。
簡単な例では、データの同一性をチェックするための「チェックサム」もその1つ。コンパイラの高速テーブル検索でもハッシュが使われる。
「チェックサム」では、データを一定のビット数で区切ってその総和を、送り側で計算してデータに付加しておく。これが「チェックサム」といわれるの由来。
受け側でこの「チェックサム」を除く、純データの「チェックサム」を計算し直し、付き合わせる...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QCRC16計算について

CRC16のプログラムを作ったのでデバッグしていて気付いた事なのですが
(産業装置で使うMODBUS-RTUのソフト)
CRC16 x16+x15+x2+1
生成多項式 0xA001

CRC16でCRCを含めたデータを再CRCするとゼロになると言われておりますが
そうならないのですが何故でしょう?

もちろん、自分の作ったソフトが信用できないので他ソフトで検証


具体例
ベクターにあるCRC16の計算ソフト - CRC16.exe
http://blog.goo.ne.jp/masaki_goo_2006/e/50b20edb79f60964faeaefe6fa064469
これに文字列"ABCD" [0x4142,0x4344]を入れて計算実行

出力結果
 初期値:0xFFFF、出力XOR:0xFFFF、出力結果、右送り0x0F85


この出力を最初の文字列に追加する
0x4142,0x4344,0x0F85

結果は0xc7e6 となってゼロになりません
やりかたが違うのでしょうか?


尚、私の作ったプログラムと上記ソフトの結果が同じです
また、ネット上にある同様な他ソフトでも同じ結果でした
(もちろんCRC計算条件が同じ物)

尚、上記ソフトで
初期値:0x0000、出力XOR:0x0000、左送り:9AA8
この場合のみCRC追加しての再CRCはゼロになりました

ゼロになる場合とならない場合があるのでしょうか?

CRC16のプログラムを作ったのでデバッグしていて気付いた事なのですが
(産業装置で使うMODBUS-RTUのソフト)
CRC16 x16+x15+x2+1
生成多項式 0xA001

CRC16でCRCを含めたデータを再CRCするとゼロになると言われておりますが
そうならないのですが何故でしょう?

もちろん、自分の作ったソフトが信用できないので他ソフトで検証


具体例
ベクターにあるCRC16の計算ソフト - CRC16.exe
http://blog.goo.ne.jp/masaki_goo_2006/e/50b20edb79f60964faeaefe6fa064469
これに文字列"ABCD" [0x4142,0x4344]を入れて計...続きを読む

Aベストアンサー

すみません, 忘れてました.

CRC を計算するときには
1. 与えられたデータの下位 (ビット送りの反対側) に「初期値」を付加する
2. 生成多項式で割って余りを求める
3. 「出力XOR」との排他的論理和を計算する
という手順をとります. つまり,
「初期値:0x0000、出力XOR:0x0000、左送り:9AA8」
は (以下 16進で表記します)
1. データ列 41 42 43 44 に初期値 0000 を付加して 41 42 43 44 00 00 を得る
2. それを生成多項式で割って余り 9AA8 を得る
3. それと出力XOR 0000 との排他的論理和を計算して 9AA8 を求める
として得られた値です.

で, 「CRCを含めたデータを再CRCする」というのはこの場合
データ列 41 42 43 44 9A A8 に対して CRC を計算する
言い替えれば「データ列 41 42 43 44 に対し 9A A8 を初期値として CRC を求める」ということです (初期値の設定ができないので, 質問文に挙がっている CRC16.exe ではこのような計算はできません). 最後にある
「尚、上記ソフトで
初期値:0x0000、出力XOR:0x0000、左送り:9AA8
この場合のみCRC追加しての再CRCはゼロになりました」
はおそらく 41 42 43 44 9A A8 というデータを入力した結果だと思いますが, それは実際には
41 42 43 44 9A A8 00 00
に対して CRC を計算しています (41 42 43 44 9A A8 に対して CRC が 0 になるならこれに対しても 0 になるけど, それは「CRC が想定しているチェック方法」ではない).

ここまでは初期値 0000, 出力XOR 0000 なので簡単ですが, その他の値を使った場合には得られた CRC を「適切に」変化させた値を初期値にしないと「CRCを含めたデータを再CRCするとゼロになる」などという都合のいいことにはなりません.

ところで, 初期値と出力XOR が両方とも 0 なら右送りでも (左送りと同じ事情で) 最終的な CRC を 0 にできるんですけど, どうでしょうか?

すみません, 忘れてました.

CRC を計算するときには
1. 与えられたデータの下位 (ビット送りの反対側) に「初期値」を付加する
2. 生成多項式で割って余りを求める
3. 「出力XOR」との排他的論理和を計算する
という手順をとります. つまり,
「初期値:0x0000、出力XOR:0x0000、左送り:9AA8」
は (以下 16進で表記します)
1. データ列 41 42 43 44 に初期値 0000 を付加して 41 42 43 44 00 00 を得る
2. それを生成多項式で割って余り 9AA8 を得る
3. それと出力XOR 0000 との排他的論理和を計算して 9AA8 を求め...続きを読む

QCRC8を教えてください

Cにて16ByteデーターをCRC8にかけたいのですがアルゴリズムがよく理解できません。
どなたかプログラムを教えていただけませんでしょうか? 
また、12Byteのときはプログラムが変わるのでしょうか?

Aベストアンサー

★CRC8 って初めて聞きました。
・私は CRC16、CRC32、CRC64、CRC128 なら聞いた事があります。
 また、CRC16、CRC32 の計算を行うルーチンも作成した経験がありますが CRC8 は初めてです。
 なお、CRC16 の『16』は 16 ビットという意味ですが、CRC8 の 8 も 8 ビットのことですよね。
・CRC16 の場合は 16 ビット以内のサイズなら同じ数値になる確率がかなり低くなります。
 このことから CRC8 では 8 ビット(256バイト)以内のサイズなら同じプログラムでかまわないと
 思います。つまり、16 バイトでも 12 バイトでも同じ CRC8 で OK です。
・『CRC8 計算』キーワードでネット検索すると多数見つかりますね。
 検索した情報から CRC 生成多項式は
 CRC8……X^8 + X^7 + X^2 + 1
 CRC16…X^16 + X^12 + X^5 + 1
 http://www.sumtak.co.jp/japanese/products/linearencoders/pulscale/futabapdf/fmf.pdf
 ↑
 6 ページより抜粋
・CRC8 の実装方法は次のリンクを参考にして下さい。
 http://kone.vis.ne.jp/diary/diaryb07.html
 ↑
 一番下より抜粋すると『CRCの国際標準』として、以下の値がある。
 CRC-12 = x12 + x11 + x3 + x2 + x1 + 1
 CRC-16 = x16 + x15 + x2 + 1
 CRC-32 = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1
 CRC-CCITT = x16 + x12 + x5 + 1
・今回は CRC8 ですので
 CRC8 = X8 + X7 + X2 + 1
 CRC8 = 110000101(2進数)
 となり、0x185 が多項式の値です。でも 8 ビットですので上位の 1 ビットを除いた 0x85 で計算します。
 CRC8 の多項式と 0x85 と他の CRC16 などのソースを元にプログラムしてみて下さい。
・以上。

参考URL:http://kone.vis.ne.jp/diary/diaryb07.html

★CRC8 って初めて聞きました。
・私は CRC16、CRC32、CRC64、CRC128 なら聞いた事があります。
 また、CRC16、CRC32 の計算を行うルーチンも作成した経験がありますが CRC8 は初めてです。
 なお、CRC16 の『16』は 16 ビットという意味ですが、CRC8 の 8 も 8 ビットのことですよね。
・CRC16 の場合は 16 ビット以内のサイズなら同じ数値になる確率がかなり低くなります。
 このことから CRC8 では 8 ビット(256バイト)以内のサイズなら同じプログラムでかまわないと
 思います。つまり、16 バイトで...続きを読む

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング