Added code for practical-1.2, i.e. captcha image.

This commit is contained in:
K
2025-10-09 20:28:34 +05:30
parent 1db296206a
commit 912433edf6
+236
View File
@@ -0,0 +1,236 @@
# CSDF - Practical-1 (Email Header Analysis)
"""
THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
Problem Statement: CAPTCHA image - Implement a program to generate and verify CAPTCHA image.
Code from CyberSecurityAndDigitalForensics (SPPU - Final Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-be-comp-content/CyberSecurityAndDigitalForensics
"""
# BEGINNING OF CODE
import random
import string
from captcha.image import ImageCaptcha
from PIL import Image
import hashlib
import time
import os
class CaptchaManager:
"""
A comprehensive CAPTCHA generation and verification system
"""
def __init__(self, length=6, width=280, height=90):
"""
Initialize the CAPTCHA manager
Args:
length: Number of characters in CAPTCHA
width: Image width in pixels
height: Image height in pixels
"""
self.length = length
self.image_captcha = ImageCaptcha(width=width, height=height)
self.captcha_store = {} # Store CAPTCHA with expiry time
self.expiry_time = 180 # 3 minutes in seconds
def generate_captcha_text(self):
"""
Generate random CAPTCHA text
Returns:
String of random alphanumeric characters
"""
characters = string.ascii_uppercase + string.digits
# Exclude ambiguous characters like 0, O, I, 1
characters = characters.replace('0', '').replace('O', '').replace('I', '').replace('1', '')
captcha_text = ''.join(random.choice(characters) for _ in range(self.length))
return captcha_text
def generate_captcha_image(self, captcha_text=None, filename='captcha.png'):
"""
Generate CAPTCHA image
Args:
captcha_text: Text to display (auto-generated if None)
filename: Output filename
Returns:
Tuple of (captcha_text, session_id, filename)
"""
if captcha_text is None:
captcha_text = self.generate_captcha_text()
# Generate image
data = self.image_captcha.generate(captcha_text)
self.image_captcha.write(captcha_text, filename)
# Create session ID
session_id = hashlib.md5(
f"{captcha_text}{time.time()}".encode()
).hexdigest()
# Store CAPTCHA with expiry time
self.captcha_store[session_id] = {
'text': captcha_text,
'timestamp': time.time()
}
return captcha_text, session_id, filename
def verify_captcha(self, session_id, user_input):
"""
Verify user's CAPTCHA input
Args:
session_id: Unique session identifier
user_input: User's input text
Returns:
Dictionary with verification result
"""
# Check if session exists
if session_id not in self.captcha_store:
return {
'success': False,
'message': 'Invalid session or CAPTCHA expired'
}
captcha_data = self.captcha_store[session_id]
current_time = time.time()
# Check expiry
if current_time - captcha_data['timestamp'] > self.expiry_time:
del self.captcha_store[session_id]
return {
'success': False,
'message': 'CAPTCHA expired. Please try again.'
}
# Verify CAPTCHA (case-insensitive)
if user_input.upper() == captcha_data['text'].upper():
del self.captcha_store[session_id] # Remove after successful verification
return {
'success': True,
'message': 'CAPTCHA verified successfully!'
}
else:
return {
'success': False,
'message': 'Incorrect CAPTCHA. Please try again.'
}
def cleanup_expired(self):
"""
Remove expired CAPTCHAs from storage
"""
current_time = time.time()
expired_sessions = [
sid for sid, data in self.captcha_store.items()
if current_time - data['timestamp'] > self.expiry_time
]
for sid in expired_sessions:
del self.captcha_store[sid]
# Alternative simple implementation using Pillow
class SimpleCaptcha:
"""
Simple CAPTCHA implementation using Pillow
"""
@staticmethod
def generate(length=6):
"""
Generate simple CAPTCHA with noise
Returns:
Tuple of (captcha_text, Image object)
"""
from PIL import ImageDraw, ImageFont
# Generate random text
chars = ''.join(random.choice(string.ascii_uppercase + string.digits)
for _ in range(length))
# Create image
img = Image.new('RGB', (200, 100), color=(73, 109, 137))
draw = ImageDraw.Draw(img)
# Try to load a font, fallback to default if not available
try:
font = ImageFont.truetype('arial.ttf', 36)
except:
font = ImageFont.load_default()
# Draw characters with random positions
x = 20
for char in chars:
y = random.randint(25, 35)
draw.text((x, y), char, font=font, fill=(255, 255, 0))
x += 30
# Add noise (dots)
for _ in range(150):
x = random.randint(0, 200)
y = random.randint(0, 100)
draw.point((x, y), fill=(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)))
# Add lines for distortion
for _ in range(5):
start = (random.randint(0, 200), random.randint(0, 100))
end = (random.randint(0, 200), random.randint(0, 100))
draw.line([start, end], fill=(255, 255, 255), width=1)
return chars, img
# Example usage and testing
def main():
"""
Demonstration of CAPTCHA generation and verification
"""
print("=== CAPTCHA Generation and Verification Demo ===\n")
# Initialize CAPTCHA manager
manager = CaptchaManager(length=6)
# Generate CAPTCHA
captcha_text, session_id, filename = manager.generate_captcha_image()
print(f"CAPTCHA Generated: {captcha_text}")
print(f"Session ID: {session_id}")
print(f"Image saved as: {filename}\n")
# Simulate user input
print("Verification Tests:")
# Test 1: Correct input
result = manager.verify_captcha(session_id, captcha_text)
print(f"Test 1 (Correct): {result}")
# Generate new CAPTCHA for next test
captcha_text, session_id, _ = manager.generate_captcha_image('test_captcha_2.png')
# Test 2: Incorrect input
result = manager.verify_captcha(session_id, "WRONG")
print(f"Test 2 (Incorrect): {result}")
# Test 3: Invalid session
result = manager.verify_captcha("invalid_session", "TEST")
print(f"Test 3 (Invalid Session): {result}")
# Demonstrate simple CAPTCHA
print("\n=== Simple CAPTCHA Demo ===")
captcha_text, img = SimpleCaptcha.generate()
img.save('simple_captcha.png')
print(f"Simple CAPTCHA Text: {captcha_text}")
print("Image saved as: simple_captcha.png")
if __name__ == "__main__":
main()
# END OF CODE