IP2Location 이용하여 IP 위도, 경도, 국가, 주소 확인하기

 

IP2Location에서 제공하는 무료 데이터베이스를 이용하여 IP 위도, 경도, 국가, 주소등 지도 위치를 확인하는 방법에 대해 알아보겠습니다.


IP2Location 장점과 단점

 

일단 가장큰 장점은 무료이면서 데이터베이스를 이용하는 것이기 때문에 검색하는데 횟수 제한이 없다는 점입니다.

하지만 데이터베이스 전체 가지고 있어야해서 그만큼 용량을 확보해야한다는 단점이 있습니다.


데이터베이스 준비하기

 

https://lite.ip2location.com/ip2location-lite

 

IP2Location LITE Database

IP2Location LITE geolocation database provides geographical information of an IP address such as the country, city, region, latitude, longitude, and much more.

lite.ip2location.com

 

위 링크에 들어가서 원하는 데이터베이스를 선택하면 Format이 BIN과 CSV 두가지가 있는데 원하는 IP 형식의 BIN파일을 다운로드 합니다.

 


IP2Location 라이브러리 설치하기

pip install IP2Location

 

pip를 이용하여 라이브러리를 설치합니다.


IP2Location 라이브러리 사용하기

 

import IP2Location, os

ip2location_db = IP2Location.IP2Location(os.path.join("BIN파일 폴더경로", "BIN파일 이름"))
#ip2location_db = IP2Location.IP2Location(os.path.join("/home/user/db", "IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-ISP-DOMAIN-NETSPEED-AREACODE-WEATHER-MOBILE-ELEVATION-USAGETYPE-ADDRESSTYPE-CATEGORY-DISTRICT-ASN-SAMPLE.BIN"))
data = ip2location_db.get_all("19.5.10.1")

print("Country Code          : " + data.country_short)
print("Country Name          : " + data.country_long)
print("Region Name           : " + data.region)
print("City Name             : " + data.city)
print("ISP Name              : " + data.isp)
print("Latitude              : " + data.latitude)
print("Longitude             : " + data.longitude)
print("Domain Name           : " + data.domain)
print("ZIP Code              : " + data.zipcode)
print("Time Zone             : " + data.timezone)
print("Net Speed             : " + data.netspeed)
print("Area Code             : " + data.idd_code)
print("IDD Code              : " + data.area_code)
print("Weather Station Code  : " + data.weather_code)
print("Weather Station Name  : " + data.weather_name)
print("MCC                   : " + data.mcc)
print("MNC                   : " + data.mnc)
print("Mobile Carrier        : " + data.mobile_brand)
print("Elevation             : " + data.elevation)
print("Usage Type            : " + data.usage_type)
print("Address Type          : " + data.address_type)
print("Category              : " + data.category)
print("District              : " + data.district)
print("ASN                   : " + data.asn)
print("AS                    : " + data.as_name)

 

위와 같이 다운로드한 BIN 파일을 메모리에 불러와 사용할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

Crypto++ 암호화 오픈 라이브러리

 

여러가지 암호화 알고리즘을 쉽게 사용할 수 있는 CryptoPP(Crypto++) 라이브러리에 대해 알아봅시다.


암호화 알고리즘 및 컴파일러 지원목록 (8.9 버전 기준)

 

컴파일러

- Visual Studio 2003 - 2022
GCC 3.3 - 13.1
Apple Clang 4.3 - 12.0
LLVM Clang 2.9 - 14.0
C++ Builder 2015
Intel C++ Compiler 9 - 16.0
Sun Studio 12u1 - 12.7
IBM XL C/C++ 10.0 - 14.0

 

암호화 알고리즘

인증된 암호화 체계 GCM, CCM, EAX, ChaCha20Poly1305, XChaCha20Poly1305
고속 스트림 암호 ChaCha (8/12/20), ChaCha (IETF) HC (128/256), Panama, Rabbit (128/256), Sosemanuk, Salsa20 (8/12/20), XChaCha (8/12/20), XSalsa20
AES 및 AES 후보 AES (Rijndael), RC6, MARS, Twofish, Serpent, CAST-256
다른 블록 암호들 ARIA, Blowfish, Camellia, CHAM, HIGHT, IDEA, Kalyna (128/256/512), LEA, SEED, RC5, SHACAL-2, SIMECK, SIMON (64/128), Skipjack, SPECK (64/128), Simeck, SM4,Threefish (256/512/1024), Triple-DES (DES-EDE2 and DES-EDE3), TEA, XTEA
블록 암호 동작 모드 ECB, CBC, CBC ciphertext stealing (CTS), CFB, OFB, counter mode (CTR), XTS
메시지 인증 코드 BLAKE2b, BLAKE2s, CMAC, CBC-MAC, DMAC, GMAC (GCM), HMAC, Poly1305, SipHash, Two-Track-MAC, VMAC
해시 함수 BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL
공개키 암호방법 RSA, DSA, Determinsitic DSA (RFC 6979), ElGamal, Nyberg-Rueppel (NR), Rabin-Williams (RW), EC-based German Digital Signature (ECGDSA), LUC, LUCELG, DLIES (variants of DHAES), ESIGN
공개 키 시스템에 대한 패딩 체계 PKCS#1 v2.0, OAEP, PSS, PSSR, IEEE P1363 EMSA2 and EMSA5
주요 합의 계획 Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), Hashed MQV (HMQV), Fully Hashed MQV (FHMQV), LUCDIF, XTR-DH
타원 곡선 암호법 ECDSA, Determinsitic ECDSA (RFC 6979), ed25519, ECGDSA, ECNR, ECIES, x25519, ECDH, ECMQV
하위 호환성 및 안전하지 않거나 오래된 알고리즘 MD2, MD4, MD5, Panama Hash, DES, ARC4, SEAL 3.0, WAKE-OFB, DESX (DES-XEX3), RC2, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square
번외 16진수, base-32, base-64, URL safe base-64, 32비트 CRC, CRC-C, Adler32 checksum 등

 

좀 더 자세한 내용은 아래 링크에서 확인하시기 바랍니다.

https://cryptopp.com/index.html

 

Crypto++ Library 8.9 | Free C++ Class Library of Cryptographic Schemes

hash functions BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL

cryptopp.com


라이브러리 소스파일 준비

 

https://cryptopp.com/downloads.html

 

Crypto++ Library | All Downloads

The downloads page provides all downloads of the Crypto++ library. The earliest download available is Crypto++ 2.3 from January 1998. Crypto++ 1.0 was released in June 1995, but the download is no longer available. The hashes provided with a download were

cryptopp.com

 

홈페이지에서 cryptopp890.zip 파일을 다운받습니다.


Windows 버전

 

1. 라이브러리 빌드하기

 

압축해제를 하고 cryptest.sin 파일을 엽니다.

 

정적 라이브러리를 사용할꺼면 cryptlib, 동적 라이브러리를 사용할꺼면 cryptdll 프로젝트를 시작프로젝트로 설정후 빌드합니다.

 

저는 정적 라이브러리로 빌드하여 위와같이 cryptlib.lib 파일이 생성되었습니다.

 

2. 라이브러리 사용하기

 

이제 라이브러리 테스트를 해볼 프로젝트를 만들어 봅시다.

프로젝트를 만들었으면 아래와 같이 프로젝트 속성을 설정해 줍니다.

 

C/C++ -> 일반 -> 추가 포함 디렉터리: cryptopp 라이브러리 헤더파일이 있는곳으로 설정합니다.

 

 

C/C++ -> 코드 생성 -> 런타임 라이브러리를 다중 스레드(/MT)로 변경해줍니다.

 

 

링커 -> 일반 -> 추가 라이브러리 디렉터리를 Crypto++ 라이브러리를 빌드해서 생긴 lib파일이 있는곳으로 설정합니다.

 

 

링커 -> 입력 -> 추가 종속성에 lib파일 정보를 설정합니다.

 

#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

typedef unsigned char byte;
typedef unsigned long long word64;

#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

void main()
{
	string stringTest = "Ruru TestString";
	string encTest, decTest;

	/* 인코딩 시작 */
	Base64Encoder encoder;

	encoder.Put((const byte*)stringTest.data(), stringTest.size());
	encoder.MessageEnd();

	word64 encSize = encoder.MaxRetrievable();
	if (encSize)
	{
		encTest.resize(encSize);
		encoder.Get((byte*)&encTest[0], encTest.size());
	}

	cout << "Base64 Encode: " << encTest << endl;

	/* 디코딩 시작 */
	Base64Decoder decoder;

	decoder.Put((byte*)encTest.data(), encTest.size());
	decoder.MessageEnd();

	word64 decSize = decoder.MaxRetrievable();
	if (decSize && decSize <= SIZE_MAX)
	{
		decTest.resize(decSize);
		decoder.Get((byte*)&decTest[0], decTest.size());
	}

	cout << "Base64 Decode: " << decTest << endl;
}

 

다음은 문자열을 Base64 인코딩, 디코딩 하는 코드입니다. Crypto++ 라이브러리의 네임스페이스는 CryptoPP를 사용합니다. 

 

 

빌드를 하면 정상적으로 동작하는것을 확인할 수 있습니다.


Linux 버전

 

리눅스는 윈도우와 달리 좀더 간편하게 라이브러리를 빌드하고 사용할 수 할수있습니다.

 

1. 라이브러리 빌드하기

 

# 압축 해제 #
unzip cryptopp890.zip -d ./cryptopp890

# 압축 해제 폴더로 이동 #
cd cryptopp890

# 정적 라이브러리, 동적 라이브러리, 테스트파일 빌드 #
# 방법 1 #
make static dynamic cryptest.exe

# 방법 2 #
make libcryptopp.a libcryptopp.so cryptest.exe

# 빌드 확인 #
ls *.so *.a *.exe

 

2. 라이브러리 사용하기

 

이제 라이브러리가 준비되었으니 테스트파일을 만들어 테스트 해봅시다.

# cryptopp890 폴더에서 뒤로가기 #
cd ..

# 테스트용 cpp파일 생성 #
vi CryptoTest.cpp

 

#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

typedef unsigned char byte;
typedef unsigned long long word64;

#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

int main()
{
	string stringTest = "Ruru TestString";
	string encTest, decTest;

	/* 인코딩 시작 */
	Base64Encoder encoder;

	encoder.Put((const byte*)stringTest.data(), stringTest.size());
	encoder.MessageEnd();

	word64 encSize = encoder.MaxRetrievable();
	if (encSize)
	{
		encTest.resize(encSize);
		encoder.Get((byte*)&encTest[0], encTest.size());
	}

	cout << "Base64 Encode: " << encTest << endl;

	/* 디코딩 시작 */
	Base64Decoder decoder;

	decoder.Put((byte*)encTest.data(), encTest.size());
	decoder.MessageEnd();

	word64 decSize = decoder.MaxRetrievable();
	if (decSize && decSize <= SIZE_MAX)
	{
		decTest.resize(decSize);
		decoder.Get((byte*)&decTest[0], decTest.size());
	}

	cout << "Base64 Decode: " << decTest << endl;
    
    return 0;
}

 

# 테스트용 cpp파일 빌드 #
g++ -DNDEBUG -g3 -O2 -Wall -Wextra -o CryptoTest CryptoTest.cpp -I ./cryptopp890 ./cryptopp890/libcryptopp.a

 

윈도우와 똑같이 문자열을 Base64 인코딩, 디코딩 하는 코드입니다. Crypto++ 라이브러리의 네임스페이스는 CryptoPP를 사용합니다. 

 

빌드를 하면 정상적으로 동작하는것을 확인할 수 있습니다.


마무리

 

지금까지 Crypto++ 암호화 오픈 라이브러리에 대해 알아보았습니다. 추후 라이브러리를 통해 다양하게 암호화 하는 방법도 정리할 예정입니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts