LoginSignup
6

More than 5 years have passed since last update.

暗号化された通信かどうか、ニューラルネットワークで識別してみる

Posted at

はじめに

暗号化された通信か、暗号化されてない通信か、ポート番号などの情報を使わずに通信の特徴量だけを使って、ニューラルネットワークで識別できるか試してみました。結果としては99%以上の精度で識別できました。

試してみた条件

ニューラルネットワーク:全結合の2層
フレームワーク:keras (tensorflow backend)
データセット:DARPA 1999 Week3 data set ( https://projects.cs.dal.ca/projectx/Download.html ) を一部変更して利用

コードとデータセット

githubに置きました。
https://github.com/kznx/traffic_classification/tree/master/ssh_or_not

説明

データセットの読み込み

データセットが arff というフォーマットなので、下記のように読み込み、numpyのarrayにします。
http://qiita.com/kznx/items/59c4b50f944c0d6079c1

正規化

kerasでは、データを正規化する必要があるようなので、scikit-learnのMinMaxScalerを使い、正規化します。

mms = MinMaxScaler()
x_norm = mms.fit_transform(train)

データの分離

訓練用データとテスト用データに分離します。scikit-learnのcross_validationを使います。

train_x, test_x, train_y, test_y = cross_validation.train_test_split(
    x_norm, target, test_size=0.2
)

正解データのフォーマットを変更します

y_train = np_utils.to_categorical(train_y, 2)
y_test = np_utils.to_categorical(test_y, 2)

モデル定義、学習、評価

こちらの投稿を参考にモデル定義してみました。
http://qiita.com/rindai87/items/546991f5ecae0ef7cde3

# モデルの定義
model = Sequential()

# ネットワークの定義
model.add(Dense(input_dim=21, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(input_dim=20, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(input_dim=20, output_dim=10))
model.add(Activation('relu'))
model.add(Dropout(0.2))

## OUTPUT  SSH or NOTSSH
model.add(Dense(output_dim=2))
model.add(Activation('softmax'))

# ネットワークのコンパイル
model.compile(loss = 'categorical_crossentropy',
              optimizer = 'sgd',
              metrics = ['accuracy'])

# 学習処理
hist = model.fit(train_x, y_train, nb_epoch = 10, batch_size = 100, verbose=1)

# 学習結果の評価
score = model.evaluate(test_x, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

結果

99.7%という予想以上にいい精度でした。

Epoch 1/10
50606/50606 [==============================] - 1s - loss: 0.2669 - acc: 0.9484     
Epoch 2/10
50606/50606 [==============================] - 1s - loss: 0.1090 - acc: 0.9832     
Epoch 3/10
50606/50606 [==============================] - 1s - loss: 0.0733 - acc: 0.9869     
Epoch 4/10
50606/50606 [==============================] - 1s - loss: 0.0597 - acc: 0.9892     
Epoch 5/10
50606/50606 [==============================] - 1s - loss: 0.0495 - acc: 0.9913     
Epoch 6/10
50606/50606 [==============================] - 1s - loss: 0.0458 - acc: 0.9923     
Epoch 7/10
50606/50606 [==============================] - 1s - loss: 0.0427 - acc: 0.9925     
Epoch 8/10
50606/50606 [==============================] - 1s - loss: 0.0400 - acc: 0.9935     
Epoch 9/10
50606/50606 [==============================] - 1s - loss: 0.0374 - acc: 0.9938     
Epoch 10/10
50606/50606 [==============================] - 1s - loss: 0.0357 - acc: 0.9942     
12096/12652 [===========================>..] - ETA: 0sTest loss: 0.0282513894941
Test accuracy: 0.997707872273

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6